{"openapi":"3.1.0","info":{"title":"Client API Gateway","description":"Client-facing API gateway for all application features","version":"0.1.0"},"paths":{"/ad-deals/flights/{route_slug}":{"get":{"tags":["ad-deals"],"summary":"Get Flight Ad Deal","operationId":"get_flight_ad_deal_ad_deals_flights__route_slug__get","parameters":[{"name":"route_slug","in":"path","required":true,"schema":{"type":"string","title":"Route Slug"}},{"name":"departure_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Travel window start (YYYY-MM-DD). Defaults to ~3 months out.","title":"Departure Date"},"description":"Travel window start (YYYY-MM-DD). Defaults to ~3 months out."},{"name":"return_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Return date (YYYY-MM-DD). Requires departure_date; defaults to a 7-day trip.","title":"Return Date"},"description":"Return date (YYYY-MM-DD). Requires departure_date; defaults to a 7-day trip."},{"name":"utm_origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Origin"}},{"name":"utm_destination","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Destination"}},{"name":"utm_route","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Route"}},{"name":"utm_source_table","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source Table"}},{"name":"utm_rank","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Rank"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAdDealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ad-deals/flights/{route_slug}/price-history":{"get":{"tags":["ad-deals"],"summary":"Get Flight Price History","description":"Public read-only price-history for a flight route (SEO route pages).\n\nMirrors the ad-deal endpoint's route resolution + rate limit, but returns a\nnormalized SerpAPI price-history series instead of live bookable fares. The\ncontent path writes no DB rows and is cached for 24h.","operationId":"get_flight_price_history_ad_deals_flights__route_slug__price_history_get","parameters":[{"name":"route_slug","in":"path","required":true,"schema":{"type":"string","title":"Route Slug"}},{"name":"departure_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Representative departure date (YYYY-MM-DD).","title":"Departure Date"},"description":"Representative departure date (YYYY-MM-DD)."},{"name":"return_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Representative return date (YYYY-MM-DD).","title":"Return Date"},"description":"Representative return date (YYYY-MM-DD)."},{"name":"utm_origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Origin"}},{"name":"utm_destination","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Destination"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightPriceHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ad-deals/hotels/{destination_slug}":{"get":{"tags":["ad-deals"],"summary":"Get Hotel Ad Deal","operationId":"get_hotel_ad_deal_ad_deals_hotels__destination_slug__get","parameters":[{"name":"destination_slug","in":"path","required":true,"schema":{"type":"string","title":"Destination Slug"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelAdDealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ad-deals/flights/{route_slug}/handoff":{"post":{"tags":["ad-deals"],"summary":"Create Flight Ad Handoff","operationId":"create_flight_ad_handoff_ad_deals_flights__route_slug__handoff_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"route_slug","in":"path","required":true,"schema":{"type":"string","title":"Route Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAdHandoffRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__ad_deals__TripResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ad-deals/hotels/{destination_slug}/handoff":{"post":{"tags":["ad-deals"],"summary":"Create Hotel Ad Handoff","operationId":"create_hotel_ad_handoff_ad_deals_hotels__destination_slug__handoff_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"destination_slug","in":"path","required":true,"schema":{"type":"string","title":"Destination Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelAdHandoffRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__ad_deals__TripResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/airlines/autocomplete/":{"get":{"tags":["airlines"],"summary":"Autocomplete Airlines","description":"Search airlines by IATA code or name. Returns all if query is empty.","operationId":"autocomplete_airlines_airlines_autocomplete__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query (code or name)","default":"","title":"Q"},"description":"Search query (code or name)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results","default":10,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AirlineResult"},"title":"Response Autocomplete Airlines Airlines Autocomplete  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/airports/autocomplete/":{"get":{"tags":["airports"],"summary":"Autocomplete Airports","description":"Autocomplete airports by IATA code, city, or airport name. Requires login.","operationId":"autocomplete_airports_airports_autocomplete__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results","default":10,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["auth"],"summary":"Register User","description":"Register the authenticated user in our system.\n\nThis endpoint should be called by the frontend after Supabase authentication\nto create the user record in our Users service. It uses the Supabase user ID\n(from JWT 'sub' claim) as the primary key.\n\nSafe to call multiple times. If user already exists, returns 200 OK.\nThe response includes the frontend's next routing step:\n- next_step=\"email\" for phone-only users who must collect a primary email\n- next_step=\"app\" for complete users\n\nRequires authentication via Bearer token (Supabase JWT).","operationId":"register_user_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RegisterUserRequest"},{"type":"null"}],"title":"Register Request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/send-otp":{"post":{"tags":["auth"],"summary":"Send Otp","description":"Send OTP for authentication.\n\nFrontend supplies Cloudflare Turnstile tokens on captcha-enabled hosts.\nSupabase verifies the token when project captcha enforcement is enabled.","operationId":"send_otp_auth_send_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendOtpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendOtpResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify-otp":{"post":{"tags":["auth"],"summary":"Verify Otp","description":"Verify OTP and complete authentication.\n\nAuth-only: does NOT create users. User creation happens at /auth/register.\nDetermines is_new_user via read-only Users service lookup (best-effort).","operationId":"verify_otp_auth_verify_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyOtpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyOtpResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/add-identity":{"post":{"tags":["auth"],"summary":"Add Identity","description":"Add email or phone to existing account.\n\nUses Supabase's update_user + resend flow to properly link\nthe new identity to the current authenticated user.","operationId":"add_identity_auth_add_identity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddIdentityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendOtpResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/verify-identity":{"post":{"tags":["auth"],"summary":"Verify Added Identity","description":"Verify OTP for newly added identity.\n\nUses phone_change/email_change type to verify the identity\nis being added to the current user (not creating a new user).","operationId":"verify_added_identity_auth_verify_identity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyOtpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Added Identity Auth Verify Identity Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/conv/trips/{trip_id}/flight-curate":{"post":{"tags":["conversational"],"summary":"Curate Flight Guide","description":"Proxy only a typed, ID-keyed curation overlay for Flight Guide.","operationId":"curate_flight_guide_conv_trips__trip_id__flight_curate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightGuideCurationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightGuideCurationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/flight-guide/{source_frame_id}":{"get":{"tags":["conversational"],"summary":"Get Flight Guide Inventory","description":"Proxy canonical Flight Guide inventory without reshaping fare cards.","operationId":"get_flight_guide_inventory_conv_trips__trip_id__flight_guide__source_frame_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}},{"name":"source_frame_id","in":"path","required":true,"schema":{"type":"string","title":"Source Frame Id"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightGuideInventoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/flight-guide/{source_frame_id}/refine":{"post":{"tags":["conversational"],"summary":"Refine Flight Guide Inventory","description":"Proxy typed Guide filters without accepting browser-owned candidates.","operationId":"refine_flight_guide_inventory_conv_trips__trip_id__flight_guide__source_frame_id__refine_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}},{"name":"source_frame_id","in":"path","required":true,"schema":{"type":"string","title":"Source Frame Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightGuideRefinementRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightGuideRefinementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/welcome":{"get":{"tags":["conversational"],"summary":"Get Welcome","description":"Return static welcome message — no trip created.","operationId":"get_welcome_conv_welcome_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Get Welcome Conv Welcome Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/conv/wake-links/{token}":{"get":{"tags":["conversational"],"summary":"Resolve Wake Link","description":"Resolve a wake short-link token — PUBLIC, the token is the secret.","operationId":"resolve_wake_link_conv_wake_links__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WakeLinkResolveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/wake-links/tap":{"post":{"tags":["conversational"],"summary":"Tap Wake Link","description":"Record a public wake-link browser open; the token is the secret.","operationId":"tap_wake_link_conv_wake_links_tap_post","responses":{"204":{"description":"Successful Response"}}}},"/conv/wake-links/share-events/{event}":{"post":{"tags":["conversational"],"summary":"Record Flight Share Event","description":"Proxy a public sender-side share outcome; the token is the secret.","operationId":"record_flight_share_event_conv_wake_links_share_events__event__post","parameters":[{"name":"event","in":"path","required":true,"schema":{"$ref":"#/components/schemas/FlightShareEvent"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/flight-shares":{"post":{"tags":["conversational"],"summary":"Create Flight Share","description":"Mint a public-safe flight share from a user's own trip.","operationId":"create_flight_share_conv_trips__trip_id__flight_shares_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightShareCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightShareCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/":{"post":{"tags":["conversational"],"summary":"Create Trip","description":"Start a new trip conversation.","operationId":"create_trip_conv_trips__post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTripRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__conversational__TripResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["conversational"],"summary":"List Trips","description":"List all trips for the authenticated user.","operationId":"list_trips_conv_trips__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Trips Conv Trips  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/messages":{"post":{"tags":["conversational"],"summary":"Send Message","description":"Send a follow-up message to an existing trip.","operationId":"send_message_conv_trips__trip_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__conversational__TripResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/checkin":{"post":{"tags":["conversational"],"summary":"Checkin Trip","description":"Trigger a check-in on a trip.","operationId":"checkin_trip_conv_trips__trip_id__checkin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Checkin Trip Conv Trips  Trip Id  Checkin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}":{"get":{"tags":["conversational"],"summary":"Get Trip","description":"Get a single trip's data.","operationId":"get_trip_conv_trips__trip_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Trip Conv Trips  Trip Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/flight-pairings/{outbound_observation_id}":{"get":{"tags":["conversational"],"summary":"Get Flight Pairings","description":"Round-trip return pairings for an outbound observation (FAC-895).\n\nSafe to poll at 1-2s intervals: the brain reads caches/registry only and\nschedules background prefetch on a miss.","operationId":"get_flight_pairings_conv_trips__trip_id__flight_pairings__outbound_observation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}},{"name":"outbound_observation_id","in":"path","required":true,"schema":{"type":"string","title":"Outbound Observation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightPairingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/flight-outbounds/{outbound_observation_id}":{"get":{"tags":["conversational"],"summary":"Get Flight Outbounds","description":"Outbound variants (\"other departures for this trip\") for an outbound (FAC-903).\n\nSafe to poll at 1-2s intervals: the brain reads the Phase-1 stash only and\nnever issues a supplier call or a fresh search.","operationId":"get_flight_outbounds_conv_trips__trip_id__flight_outbounds__outbound_observation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}},{"name":"outbound_observation_id","in":"path","required":true,"schema":{"type":"string","title":"Outbound Observation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightPairingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/pin/flight":{"post":{"tags":["conversational"],"summary":"Pin Flight","operationId":"pin_flight_conv_trips__trip_id__pin_flight_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinFlightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pin Flight Conv Trips  Trip Id  Pin Flight Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["conversational"],"summary":"Unpin Flight","operationId":"unpin_flight_conv_trips__trip_id__pin_flight_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unpin Flight Conv Trips  Trip Id  Pin Flight Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/pin/flight/hold":{"post":{"tags":["conversational"],"summary":"Hold Flight","operationId":"hold_flight_conv_trips__trip_id__pin_flight_hold_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldFlightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Hold Flight Conv Trips  Trip Id  Pin Flight Hold Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["conversational"],"summary":"Release Flight Hold","operationId":"release_flight_hold_conv_trips__trip_id__pin_flight_hold_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Release Flight Hold Conv Trips  Trip Id  Pin Flight Hold Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/pin/flight/refresh":{"post":{"tags":["conversational"],"summary":"Refresh Pinned Flight","operationId":"refresh_pinned_flight_conv_trips__trip_id__pin_flight_refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Pinned Flight Conv Trips  Trip Id  Pin Flight Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/pin/hotel":{"post":{"tags":["conversational"],"summary":"Pin Hotel","operationId":"pin_hotel_conv_trips__trip_id__pin_hotel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinHotelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pin Hotel Conv Trips  Trip Id  Pin Hotel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["conversational"],"summary":"Unpin Hotel","operationId":"unpin_hotel_conv_trips__trip_id__pin_hotel_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unpin Hotel Conv Trips  Trip Id  Pin Hotel Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/flight/returns":{"post":{"tags":["conversational"],"summary":"Fetch Flight Returns","operationId":"fetch_flight_returns_conv_trips__trip_id__flight_returns_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightReturnsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fetch Flight Returns Conv Trips  Trip Id  Flight Returns Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/archive":{"post":{"tags":["conversational"],"summary":"Archive Trip","description":"Archive a trip.","operationId":"archive_trip_conv_trips__trip_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Trip Conv Trips  Trip Id  Archive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/activity":{"post":{"tags":["conversational"],"summary":"Track Booking Activity","description":"Record booking activity. Fire-and-forget — never blocks the user.","operationId":"track_booking_activity_conv_trips__trip_id__activity_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingActivityRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/sessions/{session_id}/status":{"get":{"tags":["conversational"],"summary":"Get Session Status","description":"Poll tool status for UI spinners.","operationId":"get_session_status_conv_sessions__session_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Session Status Conv Sessions  Session Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/turns/{turn_id}":{"get":{"tags":["conversational"],"summary":"Get Turn","description":"Recover a completed turn. 404 if not found or incomplete.","operationId":"get_turn_conv_trips__trip_id__turns__turn_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}},{"name":"turn_id","in":"path","required":true,"schema":{"type":"string","title":"Turn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Turn Conv Trips  Trip Id  Turns  Turn Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/research-stats":{"get":{"tags":["conversational"],"summary":"Get Research Stats","description":"Aggregate research stats for a trip.","operationId":"get_research_stats_conv_trips__trip_id__research_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Research Stats Conv Trips  Trip Id  Research Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/signals":{"post":{"tags":["conversational"],"summary":"Send User Signal","description":"Record a non-trip membership signal without requiring chat access.","operationId":"send_user_signal_conv_signals_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSignalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Send User Signal Conv Signals Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/conv/trips/{trip_id}/signals":{"post":{"tags":["conversational"],"summary":"Send Checkout Signal","description":"Record a checkout funnel signal. Fire-and-forget — never blocks the user.","operationId":"send_checkout_signal_conv_trips__trip_id__signals_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSignalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Checkout Signal Conv Trips  Trip Id  Signals Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/chip_score":{"post":{"tags":["conversational"],"summary":"Score Input Chips","description":"Score trip-start input chips through the conversational brain.","operationId":"score_input_chips_conv_chip_score_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChipScoreRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Score Input Chips Conv Chip Score Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/hotel-areas":{"get":{"tags":["conversational"],"summary":"Get Hotel Areas","description":"Get hotel area options for a destination airport.","operationId":"get_hotel_areas_conv_hotel_areas_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"airport_code","in":"query","required":true,"schema":{"type":"string","title":"Airport Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Hotel Areas Conv Hotel Areas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/hotel-curate":{"post":{"tags":["conversational"],"summary":"Curate Hotels","description":"Get Axel's current shortlist for an existing hotel search.","operationId":"curate_hotels_conv_trips__trip_id__hotel_curate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelCurateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conv/trips/{trip_id}/hotel-curate/detail":{"post":{"tags":["conversational"],"summary":"Curate Hotel Detail","description":"Get Axel's current-context judgment for one tapped hotel.","operationId":"curate_hotel_detail_conv_trips__trip_id__hotel_curate_detail_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string","title":"Trip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelCurationDetailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelCurationDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feature-flags/":{"get":{"tags":["feature-flags"],"summary":"List Feature Flags","description":"Return all feature flags resolved for the current user.","operationId":"list_feature_flags_feature_flags__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagsListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/feature-flags/{flag_name}":{"get":{"tags":["feature-flags"],"summary":"Get Feature Flag","description":"Return a specific feature flag value resolved for the current user.","operationId":"get_feature_flag_feature_flags__flag_name__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flag_name","in":"path","required":true,"schema":{"type":"string","title":"Flag Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/booking-providers/":{"get":{"tags":["bookings"],"summary":"Get Booking Providers","description":"Return ordered list of booking providers for autocomplete.","operationId":"get_booking_providers_bookings_booking_providers__get","parameters":[{"name":"type","in":"query","required":true,"schema":{"enum":["flight","hotel"],"type":"string","description":"Booking type","title":"Type"},"description":"Booking type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingProvidersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/my-bookings/":{"get":{"tags":["bookings"],"summary":"Get My Bookings","description":"Get Axel-booked travel for the authenticated user.\n\nReturns all bookings sourced from Axel, sorted by travel date ascending\n(nulls last). No watch/monitoring enrichment. Enriches bookings with\nconv_trip_name from the brain service and image_url from the content service.","operationId":"get_my_bookings_bookings_my_bookings__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyBookingsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/{booking_id}/detail":{"get":{"tags":["bookings"],"summary":"Get Booking Detail","description":"Get enriched booking detail with typed fields.\n\nReturns structured booking data with is_axel_booked, flattened itinerary/stay,\nand capability information.","operationId":"get_booking_detail_bookings__booking_id__detail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}},{"name":"booking_type","in":"query","required":true,"schema":{"enum":["flight","hotel"],"type":"string","description":"Type of booking: 'flight' or 'hotel'","title":"Booking Type"},"description":"Type of booking: 'flight' or 'hotel'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/FlightBookingDetailResponse"},{"$ref":"#/components/schemas/HotelBookingDetailResponse"}],"title":"Response Get Booking Detail Bookings  Booking Id  Detail Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/{booking_id}":{"get":{"tags":["bookings"],"summary":"Get Booking","description":"Get booking details by ID.\n\nLooks up booking in both flight and hotel tables.\nReturns enriched response with typed fields.","operationId":"get_booking_bookings__booking_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/FlightBookingDetailResponse"},{"$ref":"#/components/schemas/HotelBookingDetailResponse"}],"title":"Response Get Booking Bookings  Booking Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/hotel/{booking_id}/cancel-info":{"get":{"tags":["bookings"],"summary":"Get Hotel Cancel Info","description":"Preview whether a hotel booking can be cancelled, and the refund estimate.","operationId":"get_hotel_cancel_info_bookings_hotel__booking_id__cancel_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelCancelInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/{booking_id}/wallet-pass":{"get":{"tags":["bookings"],"summary":"Get Booking Wallet Pass","description":"Return a signed Apple Wallet `.pkpass` for a hotel or flight booking.","operationId":"get_booking_wallet_pass_bookings__booking_id__wallet_pass_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/flight/{booking_id}/cancel-info":{"get":{"tags":["bookings"],"summary":"Get Flight Cancel Info","description":"Preview flight cancellation request and auto-refund eligibility.","operationId":"get_flight_cancel_info_bookings_flight__booking_id__cancel_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightCancelInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/{booking_type}/{booking_id}/cancel":{"post":{"tags":["bookings"],"summary":"Cancel Booking","description":"Cancel an Axel-booked reservation.\n\nRefundable cancellations cancel/refund the payment session.\nFlight cancellations create a cancellation request. Eligible flights are\nrefunded immediately; the supplier cancellation is completed by operators.\n\nMust cancel at least 24 hours before travel date.\nOnly works for bookings made through Axel repricing.","operationId":"cancel_booking_bookings__booking_type___booking_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_type","in":"path","required":true,"schema":{"enum":["hotel","flight"],"type":"string","title":"Booking Type"}},{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelBookingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/FlightCancelBookingResponse"},{"$ref":"#/components/schemas/CancelBookingResponse"}],"title":"Response Cancel Booking Bookings  Booking Type   Booking Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/flight/{booking_id}/support-requests/":{"post":{"tags":["bookings"],"summary":"Create Flight Support Request","description":"Submit a support-owned request for a confirmed upcoming Axel flight.","operationId":"create_flight_support_request_bookings_flight__booking_id__support_requests__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlightSupportRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightSupportRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/flight/{booking_id}/support-requests/{request_id}/dismiss":{"post":{"tags":["bookings"],"summary":"Dismiss Flight Support Request","description":"Dismiss a resolved request after the customer acknowledges its outcome.","operationId":"dismiss_flight_support_request_bookings_flight__booking_id__support_requests__request_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissFlightSupportRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/{booking_id}/passengers/{traveller_profile_id}":{"patch":{"tags":["bookings"],"summary":"Update Passenger","description":"Update a passenger on a flight booking.\n\nUpdates passenger info (DOB, citizenship, is_primary) on the booking\nand propagates changes to the linked TravelerProfile.","operationId":"update_passenger_bookings__booking_id__passengers__traveller_profile_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}},{"name":"traveller_profile_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Traveller Profile Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PassengerUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/{booking_id}/guests/{traveller_profile_id}":{"patch":{"tags":["bookings"],"summary":"Update Guest","description":"Update a guest on a hotel booking.\n\nUpdates guest info (DOB, citizenship, is_primary) on the booking\nand propagates changes to the linked TravelerProfile.","operationId":"update_guest_bookings__booking_id__guests__traveller_profile_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","title":"Booking Id"}},{"name":"traveller_profile_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Traveller Profile Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuestUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/parse-screenshot":{"post":{"tags":["bookings"],"summary":"Parse Screenshot","description":"Parse a booking screenshot and return extracted fields for form autofill.\n\nAutomatically detects whether the screenshot is a flight or hotel booking.","operationId":"parse_screenshot_bookings_parse_screenshot_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_parse_screenshot_bookings_parse_screenshot_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/FlightScreenshotParseResponse"},{"$ref":"#/components/schemas/HotelScreenshotParseResponse"}],"title":"Response Parse Screenshot Bookings Parse Screenshot Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/flight":{"post":{"tags":["bookings"],"summary":"Create Flight Booking","description":"Create a flight booking from screenshot + form.","operationId":"create_flight_booking_bookings_flight_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualFlightBookingRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/hotel":{"post":{"tags":["bookings"],"summary":"Create Hotel Booking","description":"Create a hotel booking from screenshot + form.","operationId":"create_hotel_booking_bookings_hotel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualHotelBookingRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/flight/code":{"post":{"tags":["bookings"],"summary":"Create Flight Booking By Code","description":"Create a flight booking from a confirmation code.","operationId":"create_flight_booking_by_code_bookings_flight_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmationCodeBookingRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/hotel/code":{"post":{"tags":["bookings"],"summary":"Create Hotel Booking By Code","description":"Create a hotel booking from a confirmation code.","operationId":"create_hotel_booking_by_code_bookings_hotel_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmationCodeBookingRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/flight/sparse":{"post":{"tags":["bookings"],"summary":"Create Sparse Flight Booking","description":"Create a flight booking from user-described sparse fields.","operationId":"create_sparse_flight_booking_bookings_flight_sparse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SparseFlightBookingRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/bookings/hotel/sparse":{"post":{"tags":["bookings"],"summary":"Create Sparse Hotel Booking","description":"Create a hotel booking from user-described sparse fields.","operationId":"create_sparse_hotel_booking_bookings_hotel_sparse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SparseHotelBookingRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelBookingDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/browser-extension/config/":{"get":{"tags":["browser-extension"],"summary":"Get Extension Config","description":"Serve the extension's declarative remote config from the param store.\n\nDeliberately unauthenticated: the payload is public data (a kill switch\nand CSS selector strings), and the kill switch must reach signed-out and\nbroken-auth clients. Publishing a new app-config param-store version is\nthe operational lever; extensions poll with a 15-minute client cache.","operationId":"get_extension_config_browser_extension_config__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionRemoteConfigResponse"}}}}}}},"/browser-extension/client-metrics/":{"post":{"tags":["browser-extension"],"summary":"Record Client Metrics","description":"Accept aggregate scan-outcome counters from the extension.\n\nThe extension fails closed on every extraction problem, so these counters\nare the only signal that distinguishes \"Google changed their markup\" from\n\"no cheaper price today\". Counter names are schema-validated; values are\ncounts only. One structured log line per batch keeps the payload\nRender-queryable and lets a Sentry/log alert fire on a reason spike.","operationId":"record_client_metrics_browser_extension_client_metrics__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionClientMetricsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionClientMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/browser-extension/credentials/":{"post":{"tags":["browser-extension"],"summary":"Create Extension Credential","description":"Exchange a full Supabase session for a narrow installation credential.\n\nThe extension calls this once right after connecting, stores the opaque\ncredential, and discards the session — so a compromised extension storage\nleaks a revocable, extension-only bearer instead of the account. Only a\nfull session may mint; an installation credential cannot widen itself.\nThe raw value appears exactly once, in this response.","operationId":"create_extension_credential_browser_extension_credentials__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionCredentialResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/browser-extension/credentials/refresh/":{"post":{"tags":["browser-extension"],"summary":"Refresh Extension Credential","description":"Rotate the presented credential before it expires.\n\nInstallation-credential auth only: the extension no longer holds a\nsession to re-mint with, so rotation is how an installation outlives the\ncredential TTL. The old credential stays valid for a short grace window\nso requests in flight during the swap cannot fail into a sign-out. The\nflag gate runs here too — turning a user's flag off ends their ability\nto keep a credential alive.","operationId":"refresh_extension_credential_browser_extension_credentials_refresh__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionCredentialResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/browser-extension/credentials/revoke/":{"post":{"tags":["browser-extension"],"summary":"Revoke Extension Credential Route","description":"Delete the presented credential; the extension calls this on sign-out.\n\nDeliberately not flag-gated: cleanup must keep working for a user whose\nflag was just turned off. Idempotent — revoking twice reports\nrevoked=false the second time because the credential no longer\nauthenticates.","operationId":"revoke_extension_credential_route_browser_extension_credentials_revoke__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionCredentialRevokeResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/browser-extension/flight-handoffs/":{"post":{"tags":["browser-extension"],"summary":"Create Flight Handoff","operationId":"create_flight_handoff_browser_extension_flight_handoffs__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionFlightHandoffRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionFlightHandoffResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/browser-extension/flight-price-checks/":{"post":{"tags":["browser-extension"],"summary":"Check Visible Flight Prices","description":"Return only exact observations with an Axel price below the visible price.","operationId":"check_visible_flight_prices_browser_extension_flight_price_checks__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionFlightPriceCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionFlightPriceCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/flights/search":{"get":{"tags":["flights"],"summary":"Search Flights","description":"Proxy flight search to content service, forwarding all query params.","operationId":"search_flights_flights_search_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/flights/":{"get":{"tags":["flights"],"summary":"List Flights","description":"Get flights for the current user.\n\nReturns flight segments from bookings.\nCan filter by booking ID.","operationId":"list_flights_flights__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by booking ID","title":"Booking"},"description":"Filter by booking ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FlightSegment"},"title":"Response List Flights Flights  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gmail/import/start":{"post":{"tags":["gmail"],"summary":"Start Gmail Import","description":"Start Gmail import flow - returns OAuth URL for frontend to redirect.\n\nThis endpoint is called by the frontend to initiate Gmail account linking.\nIt calls the travel_email service to generate an OAuth URL, which the\nfrontend uses to redirect the user to Google for authorization.\n\nReturns:\n    GmailImportStartResponse with auth_url on success, error_message on failure","operationId":"start_gmail_import_gmail_import_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartGmailImportBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GmailImportStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/gmail/import/accounts":{"get":{"tags":["gmail"],"summary":"List Gmail Accounts","description":"List linked Gmail accounts for the current user.","operationId":"list_gmail_accounts_gmail_import_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GmailAccountsListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/gmail/accounts/{credential_id}":{"delete":{"tags":["gmail"],"summary":"Disconnect Gmail Account","description":"Disconnect a Gmail account.\n\nRemoves OAuth connection. Imported bookings remain.\nFuture scanning stops for this account. Can reconnect anytime.","operationId":"disconnect_gmail_account_gmail_accounts__credential_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotels/autocomplete/test":{"get":{"tags":["hotels"],"summary":"Autocomplete Test","description":"Same logic, different content service path. For debugging.","operationId":"autocomplete_test_hotels_autocomplete_test_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotels/autocomplete/":{"get":{"tags":["hotels"],"summary":"Autocomplete Hotels","description":"Suggest hotels by name with typo tolerance. Requires login.","operationId":"autocomplete_hotels_hotels_autocomplete__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max suggestions","default":10,"title":"Limit"},"description":"Max suggestions"},{"name":"latitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Latitude"}},{"name":"longitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Longitude"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":50,"exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotels/{hotel_id}":{"get":{"tags":["hotels"],"summary":"Get Hotel Checkout Detail","description":"Proxy hotel checkout detail from content service.","operationId":"get_hotel_checkout_detail_hotels__hotel_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_id","in":"path","required":true,"schema":{"type":"integer","title":"Hotel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-deals/cities/":{"get":{"tags":["hotel-deals"],"summary":"List Cities","description":"List distinct cities with deal locations, for type-ahead.","operationId":"list_cities_hotel_deals_cities__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hotel-deals/locations/":{"get":{"tags":["hotel-deals"],"summary":"List Locations","description":"List all available deal locations.","operationId":"list_locations_hotel_deals_locations__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hotel-deals/nearby/{iata}/prices":{"get":{"tags":["hotel-deals"],"summary":"Get Nearby Prices","description":"Get live ETG prices for deal hotels near an airport.","operationId":"get_nearby_prices_hotel_deals_nearby__iata__prices_get","parameters":[{"name":"iata","in":"path","required":true,"schema":{"type":"string","title":"Iata"}},{"name":"check_in","in":"query","required":true,"schema":{"type":"string","title":"Check In"}},{"name":"check_out","in":"query","required":true,"schema":{"type":"string","title":"Check Out"}},{"name":"guests","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":2,"title":"Guests"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-deals/nearby/{iata}":{"get":{"tags":["hotel-deals"],"summary":"Get Nearby Deals","description":"Get hotel deals near an airport, across up to 3 closest locations.","operationId":"get_nearby_deals_hotel_deals_nearby__iata__get","parameters":[{"name":"iata","in":"path","required":true,"schema":{"type":"string","title":"Iata"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3,"minimum":1},{"type":"null"}],"title":"Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-deals/by-city/{city_slug}/prices":{"get":{"tags":["hotel-deals"],"summary":"Get City Prices","description":"Get live ETG prices for deal hotels in a city.","operationId":"get_city_prices_hotel_deals_by_city__city_slug__prices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"city_slug","in":"path","required":true,"schema":{"type":"string","title":"City Slug"}},{"name":"check_in","in":"query","required":true,"schema":{"type":"string","title":"Check In"}},{"name":"check_out","in":"query","required":true,"schema":{"type":"string","title":"Check Out"}},{"name":"flexibility","in":"query","required":false,"schema":{"type":"string","default":"exact","title":"Flexibility"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-deals/by-hotel/{hotel_id}":{"get":{"tags":["hotel-deals"],"summary":"Get Deals For Hotel","description":"Find deals near a specific hotel.","operationId":"get_deals_for_hotel_hotel_deals_by_hotel__hotel_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_id","in":"path","required":true,"schema":{"type":"integer","title":"Hotel Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-deals/{slug}":{"get":{"tags":["hotel-deals"],"summary":"Get Deals","description":"Get top hotel deals for a location.","operationId":"get_deals_hotel_deals__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3,"minimum":1},{"type":"null"}],"title":"Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-images/{hotel_id}/{index}":{"get":{"tags":["hotel-images"],"summary":"Redirect Hotel Image","description":"302-redirect to the current upstream URL for a hotel image index.\n\nAny content-service failure degrades to 404 — a broken image beats a\n500 for an ``<img>`` tag, and this public route must never leak\ninternal errors.","operationId":"redirect_hotel_image_hotel_images__hotel_id___index__get","parameters":[{"name":"hotel_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Hotel Id"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","minimum":0,"title":"Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/options":{"get":{"tags":["flight-booking"],"summary":"Get Flight Booking Options","description":"Fetch fare families (Basic Economy, Main Cabin, etc.) for a flight observation.\n\nDelegates observation lookup and route extraction to the content service.\nEach option has its own observation_id suitable for POST /flight-booking/sessions/.","operationId":"get_flight_booking_options_flight_booking_options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"observation_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Base flight observation from search results","title":"Observation Id"},"description":"Base flight observation from search results"},{"name":"passengers","in":"query","required":false,"schema":{"type":"integer","maximum":9,"minimum":1,"description":"Number of passengers","default":1,"title":"Passengers"},"description":"Number of passengers"},{"name":"adults","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9,"minimum":0},{"type":"null"}],"title":"Adults"}},{"name":"children","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9,"minimum":0},{"type":"null"}],"title":"Children"}},{"name":"infants_in_seat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9,"minimum":0},{"type":"null"}],"title":"Infants In Seat"}},{"name":"infants_on_lap","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9,"minimum":0},{"type":"null"}],"title":"Infants On Lap"}},{"name":"conv_trip_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Conversation trip id used to apply an active limited-time offer or fare hold.","title":"Conv Trip Id"},"description":"Conversation trip id used to apply an active limited-time offer or fare hold."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingOptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/options/prefetch":{"post":{"tags":["flight-booking"],"summary":"Prefetch Flight Booking Options Endpoint","description":"Warm fare options for a selected flight without changing checkout behavior.","operationId":"prefetch_flight_booking_options_endpoint_flight_booking_options_prefetch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingOptionsPrefetchRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Prefetch Flight Booking Options Endpoint Flight Booking Options Prefetch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/flight-booking/sessions/":{"post":{"tags":["flight-booking"],"summary":"Create Flight Booking Session","description":"Create a new flight-booking checkout session.","operationId":"create_flight_booking_session_flight_booking_sessions__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/flight-booking/sessions/in-progress":{"get":{"tags":["flight-booking"],"summary":"Get In Progress Flight Booking Session","description":"Fetch latest active or failed non-expired flight-booking session.","operationId":"get_in_progress_flight_booking_session_flight_booking_sessions_in_progress_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_trip_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"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.","title":"Conv Trip Id"},"description":"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."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}":{"get":{"tags":["flight-booking"],"summary":"Get Flight Booking Session","description":"Fetch a flight-booking session by ID.","operationId":"get_flight_booking_session_flight_booking_sessions__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["flight-booking"],"summary":"Update Flight Booking Session","description":"Patch an existing flight-booking session.","operationId":"update_flight_booking_session_flight_booking_sessions__session_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/refresh":{"post":{"tags":["flight-booking"],"summary":"Refresh Flight Booking Session","description":"Refresh a flight booking session with current pricing.","operationId":"refresh_flight_booking_session_flight_booking_sessions__session_id__refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionRefreshResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/reverify-entitlement":{"post":{"tags":["flight-booking"],"summary":"Reverify Flight Booking Session Entitlement","description":"Re-run the charge-time entitlement verifies on a session (ENG-30052).\n\nCalled after a mid-checkout membership join so the payment screen's\ndisplayed total moves to the entitled price; /pay stays the enforcement\npoint and re-runs the same verifies.","operationId":"reverify_flight_booking_session_entitlement_flight_booking_sessions__session_id__reverify_entitlement_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionEntitlementReverifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/fare-hold-preview":{"get":{"tags":["flight-booking"],"summary":"Preview Flight Booking Session Fare Hold","description":"Read-only preview of the fare-hold charge /pay would apply (FAC-940).","operationId":"preview_flight_booking_session_fare_hold_flight_booking_sessions__session_id__fare_hold_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingFareHoldPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/reconcile-travelers":{"post":{"tags":["flight-booking"],"summary":"Reconcile Flight Booking Session Travelers","description":"Reconcile selected travelers against session pricing.","operationId":"reconcile_flight_booking_session_travelers_flight_booking_sessions__session_id__reconcile_travelers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionReconcileTravelersRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingSessionReconcileTravelersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/prewarm":{"post":{"tags":["flight-booking"],"summary":"Prewarm Flight Booking Ancillaries","description":"Start Gordian trip setup for a flight-booking checkout session.","operationId":"prewarm_flight_booking_ancillaries_flight_booking_sessions__session_id__ancillaries_prewarm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillarySessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/activate":{"post":{"tags":["flight-booking"],"summary":"Activate Flight Booking Ancillaries","description":"Patch selected travelers into Gordian before rendering ancillaries.","operationId":"activate_flight_booking_ancillaries_flight_booking_sessions__session_id__ancillaries_activate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillarySessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/basket":{"put":{"tags":["flight-booking"],"summary":"Update Flight Booking Ancillary Basket","description":"Persist the latest Gordian basket snapshot for a checkout session.","operationId":"update_flight_booking_ancillary_basket_flight_booking_sessions__session_id__ancillaries_basket_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillaryBasketUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillarySessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/options":{"get":{"tags":["flight-booking"],"summary":"Get Flight Booking Ancillary Options","description":"Fetch Axel-renderable Gordian bag options for checkout.","operationId":"get_flight_booking_ancillary_options_flight_booking_sessions__session_id__ancillaries_options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillaryOptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/bags":{"put":{"tags":["flight-booking"],"summary":"Update Flight Booking Ancillary Bags","description":"Replace the current Axel-selected Gordian bag selections.","operationId":"update_flight_booking_ancillary_bags_flight_booking_sessions__session_id__ancillaries_bags_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillaryBagSelectionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillarySessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/seats":{"put":{"tags":["flight-booking"],"summary":"Update Flight Booking Ancillary Seats","description":"Replace the current Axel-selected Gordian seat selections.","operationId":"update_flight_booking_ancillary_seats_flight_booking_sessions__session_id__ancillaries_seats_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillarySeatSelectionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillarySessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/ancillaries/validate":{"post":{"tags":["flight-booking"],"summary":"Validate Flight Booking Ancillaries","description":"Validate the locally persisted Gordian basket before payment.","operationId":"validate_flight_booking_ancillaries_flight_booking_sessions__session_id__ancillaries_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightAncillaryValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/pay":{"post":{"tags":["flight-booking"],"summary":"Pay Flight Booking Session","description":"Charge and create a flight booking + operator task.","operationId":"pay_flight_booking_session_flight_booking_sessions__session_id__pay_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingPayRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingPaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flight-booking/sessions/{session_id}/confirm-payment":{"post":{"tags":["flight-booking"],"summary":"Confirm Flight Booking Payment","description":"Confirm payment after frontend Stripe Elements card entry.\n\nCalled after stripe.confirmPayment() succeeds for inline-pay sessions.","operationId":"confirm_flight_booking_payment_flight_booking_sessions__session_id__confirm_payment_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingPaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-purchases/":{"post":{"tags":["hotel-purchases"],"summary":"Create Hotel Purchase","description":"Start a hotel purchase with auth-capture payment flow.\n\nTwo modes:\n- **Saved card** (payment_method_id provided): resolves Stripe customer,\n  creates hotel purchase with off-session auth. Returns status \"processing\".\n- **Inline pay** (no payment_method_id): resolves user email for Stripe customer\n  creation, creates hotel purchase with unconfirmed PI. Returns client_secret\n  for frontend card entry.","operationId":"create_hotel_purchase_hotel_purchases__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHotelPurchaseRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHotelPurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/hotel-purchases/{hotel_purchase_id}/confirm-payment":{"post":{"tags":["hotel-purchases"],"summary":"Confirm Hotel Purchase Payment","description":"Confirm payment after frontend Stripe Elements card entry.\n\nCalled after stripe.confirmPayment() succeeds. Advances the hotel purchase\nstate machine from INITIATED to HOTEL_AUTHORIZED.","operationId":"confirm_hotel_purchase_payment_hotel_purchases__hotel_purchase_id__confirm_payment_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_purchase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hotel Purchase Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmPaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-purchases/{hotel_purchase_id}/confirm-setup":{"post":{"tags":["hotel-purchases"],"summary":"Confirm Hotel Purchase Setup","description":"Confirm SetupIntent for deferred inline-pay hotel purchase.\n\nCalled after stripe.confirmSetup() succeeds. Saves the payment method\nand kicks off the deferred booking flow.","operationId":"confirm_hotel_purchase_setup_hotel_purchases__hotel_purchase_id__confirm_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_purchase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hotel Purchase Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmPaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-purchases/{hotel_purchase_id}/deferred-payment-method":{"post":{"tags":["hotel-purchases"],"summary":"Update Deferred Payment Method","description":"Update the payment method that a scheduled deferred hotel charge uses.","operationId":"update_deferred_payment_method_hotel_purchases__hotel_purchase_id__deferred_payment_method_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_purchase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hotel Purchase Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeferredPaymentMethodRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeferredPaymentMethodResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-purchases/{hotel_purchase_id}/charge-now":{"post":{"tags":["hotel-purchases"],"summary":"Charge Deferred Hotel Purchase Now","description":"Immediately charge a scheduled deferred hotel purchase.","operationId":"charge_deferred_hotel_purchase_now_hotel_purchases__hotel_purchase_id__charge_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_purchase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hotel Purchase Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargeDeferredHotelPurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-purchases/prebook":{"post":{"tags":["hotel-purchases"],"summary":"Prebook Hotel Purchase","description":"Prebook a quote before payment authorization.","operationId":"prebook_hotel_purchase_hotel_purchases_prebook_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrebookHotelPurchaseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrebookHotelPurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/hotel-purchases/{hotel_purchase_id}/status":{"get":{"tags":["hotel-purchases"],"summary":"Get Hotel Purchase Status","description":"Poll hotel purchase status for frontend.","operationId":"get_hotel_purchase_status_hotel_purchases__hotel_purchase_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_purchase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hotel Purchase Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelPurchaseStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/sessions/":{"post":{"tags":["hotel-search"],"summary":"Create Session","description":"Create a hotel search session.","operationId":"create_session_hotel_search_sessions__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHotelSearchSessionRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/hotel-search/sessions/{session_id}/query":{"post":{"tags":["hotel-search"],"summary":"Query Session","description":"Query hotels within a session.","operationId":"query_session_hotel_search_sessions__session_id__query_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchQueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/sessions/{session_id}/hotels/":{"post":{"tags":["hotel-search"],"summary":"Focus Hotel In Session","description":"Add a canonical named hotel to the active map session.","operationId":"focus_hotel_in_session_hotel_search_sessions__session_id__hotels__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FocusHotelInSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FocusHotelInSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/sessions/{session_id}":{"get":{"tags":["hotel-search"],"summary":"Get Session Status","description":"Session freshness and the party it was created for.\n\nContent owns occupancy — the prices endpoint resolves it from the session\nand ignores whatever the client sent. This is how a client reads the same\nanswer rather than rebuilding it from local state, which has previously\ndropped children and flattened multi-room parties.\n\nRead-only: never extends the session TTL and never re-prices.","operationId":"get_session_status_hotel_search_sessions__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchSessionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hotel-search"],"summary":"Delete Session","description":"Delete a hotel search session.","operationId":"delete_session_hotel_search_sessions__session_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/hotels/images/bulk":{"post":{"tags":["hotel-search"],"summary":"Get Bulk Hotel Images","description":"Get images for multiple hotels in bulk.","operationId":"get_bulk_hotel_images_hotel_search_hotels_images_bulk_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/hotel-search/hotels/{hotel_id}/prices":{"post":{"tags":["hotel-search"],"summary":"Get Hotel Prices","description":"Get hotel room prices — standalone, no session required.\n\nGuests parse leniently here: content resolves real occupancy from the\nsearch session (or strictly validates when sessionless), so the gateway\nmust not 422 a client-mangled guest config before content can.","operationId":"get_hotel_prices_hotel_search_hotels__hotel_id__prices_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_id","in":"path","required":true,"schema":{"type":"integer","title":"Hotel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelPricesRequestLenient"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoomTypeGroup"},"title":"Response Get Hotel Prices Hotel Search Hotels  Hotel Id  Prices Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/hotels/{hotel_id}/book":{"post":{"tags":["hotel-search"],"summary":"Book Hotel","description":"Book a hotel room from a cached offer.","operationId":"book_hotel_hotel_search_hotels__hotel_id__book_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_id","in":"path","required":true,"schema":{"type":"integer","title":"Hotel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/hotels/static/":{"get":{"tags":["hotel-search"],"summary":"Get Bulk Hotel Static Data","description":"Bulk hotel static data for list surfaces (map sheet, hotel cards).\n\nNot gateway-cached: the ID set varies per search so hit rates would be\npoor, and the content-side path is cache/DB-only (no supplier calls).","operationId":"get_bulk_hotel_static_data_hotel_search_hotels_static__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_ids","in":"query","required":true,"schema":{"type":"array","items":{"type":"integer"},"minItems":1,"maxItems":50,"title":"Hotel Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/hotels/{hotel_id}/static":{"get":{"tags":["hotel-search"],"summary":"Get Hotel Static Data","description":"Get hotel static data (images, descriptions, amenities, room types, policies).","operationId":"get_hotel_static_data_hotel_search_hotels__hotel_id__static_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_id","in":"path","required":true,"schema":{"type":"integer","title":"Hotel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelStaticDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/membership-preview":{"post":{"tags":["hotel-search"],"summary":"Hotel Membership Preview","description":"Return one example without signup; do not expose or accept hotel session IDs.\n\nLike the existing public hotel ad flow, search/polling stays inside this\nbounded request. The frontend keeps both flight choices available while it waits.","operationId":"hotel_membership_preview_hotel_search_membership_preview_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelMembershipPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/HotelMembershipExample"},{"type":"null"}],"title":"Response Hotel Membership Preview Hotel Search Membership Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/booking-sessions/":{"post":{"tags":["hotel-search"],"summary":"Create Hotel Search Booking Session","description":"Create or upsert a resumable hotel-search booking session.","operationId":"create_hotel_search_booking_session_hotel_search_booking_sessions__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/hotel-search/booking-sessions/resume":{"get":{"tags":["hotel-search"],"summary":"Get Resumable Hotel Search Booking Session","description":"Fetch latest resumable session for the current user and selected offer.","operationId":"get_resumable_hotel_search_booking_session_hotel_search_booking_sessions_resume_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hotel_id","in":"query","required":true,"schema":{"type":"integer","title":"Hotel Id"}},{"name":"quote_id","in":"query","required":true,"schema":{"type":"string","title":"Quote Id"}},{"name":"check_in","in":"query","required":true,"schema":{"type":"string","title":"Check In"}},{"name":"check_out","in":"query","required":true,"schema":{"type":"string","title":"Check Out"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-search/booking-sessions/in-progress":{"get":{"tags":["hotel-search"],"summary":"Get In Progress Hotel Search Booking Session","description":"Fetch latest active booking session for current user.","operationId":"get_in_progress_hotel_search_booking_session_hotel_search_booking_sessions_in_progress_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/hotel-search/booking-sessions/{session_id}":{"get":{"tags":["hotel-search"],"summary":"Get Hotel Search Booking Session","description":"Fetch a specific booking session by ID.","operationId":"get_hotel_search_booking_session_hotel_search_booking_sessions__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hotel-search"],"summary":"Update Hotel Search Booking Session","description":"Patch an existing hotel-search booking session.","operationId":"update_hotel_search_booking_session_hotel_search_booking_sessions__session_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelSearchBookingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hotel-stays/":{"get":{"tags":["hotel-stays"],"summary":"List Hotel Stays","description":"Get hotel stays for the current user.\n\nCan filter by booking ID.","operationId":"list_hotel_stays_hotel_stays__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by booking ID","title":"Booking"},"description":"Filter by booking ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HotelStayResponse"},"title":"Response List Hotel Stays Hotel Stays  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/":{"get":{"tags":["me"],"summary":"Get Me","description":"Get current user's profile.\n\nReturns the authenticated user's profile information with enrichment data.","operationId":"get_me_me__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["me"],"summary":"Update Me","description":"Update current user's profile and settings.\n\nOnly provided fields will be updated. Omitted fields are not modified.","operationId":"update_me_me__patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/forwarding-address":{"get":{"tags":["me"],"summary":"Get Forwarding Address","description":"Get the email forwarding address for booking imports.","operationId":"get_forwarding_address_me_forwarding_address_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForwardingAddressResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/email-forwarding":{"post":{"tags":["me"],"summary":"Add Email Forwarding","description":"Request to add email address to user's forwarding list.\n\nSends a verification email with a confirmation link.\nThe email is not added to verified_emails until the link is clicked.","operationId":"add_email_forwarding_me_email_forwarding_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddEmailForwardingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddEmailForwardingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/email":{"post":{"tags":["me"],"summary":"Set Email","description":"Set primary email for phone-only or incomplete users.\n\nUsed during account completion and other email collection points. The email is:\n1. Set as primary (unverified) - for communications TO user\n2. Verification email sent - so they can use it for forwarding\n\nReturns 409 if email already exists on another account.\n\nThe email is mandatory for account completion but verification remains optional.\nget_user_by_email() checks both primary and verified emails, so an unverified\nprimary email set here still prevents another account from claiming it.","operationId":"set_email_me_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/email/resend-verification":{"post":{"tags":["me"],"summary":"Resend Email Verification","description":"Resend verification email for the user's primary email.\n\nUse this when the original verification link has expired (24h) or was lost.\nReturns 400 if no email is set or if email is already verified.","operationId":"resend_email_verification_me_email_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/email-forwarding/{email}":{"delete":{"tags":["me"],"summary":"Remove Email Forwarding","description":"Remove email address from user's forwarding list.\n\nReturns the full list of verified emails after successful removal.","operationId":"remove_email_forwarding_me_email_forwarding__email__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailForwardingListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me":{"delete":{"tags":["me"],"summary":"Delete Account","description":"Delete your account and all associated data.\n\nThis action is irreversible. All your data will be permanently deleted.","operationId":"delete_account_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Delete Account Me Delete"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/referral-code":{"get":{"tags":["me"],"summary":"Get My Referral Code","description":"Get current user's referral code.\n\nCreates a code if the user doesn't have one yet.\nRequires user to have a name set.","operationId":"get_my_referral_code_me_referral_code_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralCodeResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/referrals":{"get":{"tags":["me"],"summary":"Get My Referrals","description":"Get list of friends you've referred and their credit status.","operationId":"get_my_referrals_me_referrals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserReferralsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/promo-codes/redeem":{"post":{"tags":["me"],"summary":"Redeem My Promo Code","description":"Assign an enterable promo code to the authenticated user.","operationId":"redeem_my_promo_code_me_promo_codes_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemPromoCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPromoCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/codes/validate/{code}":{"get":{"tags":["me"],"summary":"Validate My Code","description":"Identify a user-entered code: promo (e.g. YCAXEL) or friend referral.\n\nPromo namespace wins on collision so existing partner codes keep working.","operationId":"validate_my_code_me_codes_validate__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/codes/redeem":{"post":{"tags":["me"],"summary":"Redeem My Code","description":"Redeem a user-entered code across both namespaces.\n\nPromo codes assign their benefit (e.g. YCAXEL's flight discount).\nReferral codes attach the referrer and grant the instant referee credit;\nonly users who have not yet made a paid booking can attach one.","operationId":"redeem_my_code_me_codes_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeRedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/airports/{iata}/nearby-cities/":{"get":{"tags":["airports"],"summary":"Nearby Cities","description":"Get nearby city names for an airport IATA code.","operationId":"nearby_cities_airports__iata__nearby_cities__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iata","in":"path","required":true,"schema":{"type":"string","title":"Iata"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Nearby Cities Airports  Iata  Nearby Cities  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/membership-plans/":{"get":{"tags":["membership-plans"],"summary":"Get Membership Plans","description":"Get available membership plans.\n\nReturns active membership plans with pricing details.\nThis endpoint does not require authentication.","operationId":"get_membership_plans_membership_plans__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MembershipPlanResponse"},"type":"array","title":"Response Get Membership Plans Membership Plans  Get"}}}}}}},"/memberships/":{"get":{"tags":["memberships"],"summary":"Get Active Membership","description":"Get the authenticated user's active membership.\n\nReturns 404 if the user has no active membership (e.g., still in onboarding\nand hasn't selected a plan yet).\n\nRequires authentication via Bearer token.","operationId":"get_active_membership_memberships__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MembershipWithReferrer"},{"type":"null"}],"title":"Response Get Active Membership Memberships  Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["memberships"],"summary":"Upgrade Membership","description":"Upgrade to paid membership.\n\nReturns Stripe client_secret for frontend payment confirmation.\nFrontend uses client_secret with Stripe Elements to complete payment.\nMembership is created after successful payment via webhook.\n\nRequires authentication via Bearer token.","operationId":"upgrade_membership_memberships__post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UpgradeMembershipRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeMembershipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["memberships"],"summary":"Cancel Membership","description":"Cancel the authenticated user's active membership.\n\nStops renewal through the user's Temporal workflow. Benefits remain active\nuntil Stripe ends the current billing period.\n\nRequires authentication via Bearer token.","operationId":"cancel_membership_memberships__delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/promo-codes/validate/{code}":{"get":{"tags":["promo-codes"],"summary":"Validate Promo Code","description":"Public signup-time promo code existence check.\n\nThis only confirms the entered code is in the enterable promo-code set.\nIt does not attach the code to a user or calculate booking discounts.","operationId":"validate_promo_code_promo_codes_validate__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatePromoCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/referrals/validate/{code}":{"get":{"tags":["referrals"],"summary":"Validate Referral Code","description":"Validate a referral code.\n\nPublic endpoint - does not require authentication.\nReturns the referrer's first name if valid.","operationId":"validate_referral_code_referrals_validate__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/intercom/session":{"post":{"tags":["support"],"summary":"Create Intercom Session","description":"Create a signed Intercom Messenger JWT for the authenticated user.","operationId":"create_intercom_session_support_intercom_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntercomSessionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/travelers/":{"get":{"tags":["travelers"],"summary":"List Travelers","description":"Get all travelers for the current user.","operationId":"list_travelers_travelers__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TravelerResponse"},"type":"array","title":"Response List Travelers Travelers  Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["travelers"],"summary":"Create Traveler","description":"Create a new traveler.","operationId":"create_traveler_travelers__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTravelerRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TravelerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/travelers/{traveler_id}":{"get":{"tags":["travelers"],"summary":"Get Traveler","description":"Get a specific traveler.","operationId":"get_traveler_travelers__traveler_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"traveler_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Traveler Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TravelerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["travelers"],"summary":"Update Traveler","description":"Update a traveler.","operationId":"update_traveler_travelers__traveler_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"traveler_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Traveler Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTravelerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TravelerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["travelers"],"summary":"Delete Traveler","description":"Remove a traveler from the user's reusable saved profiles.","operationId":"delete_traveler_travelers__traveler_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"traveler_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Traveler Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/confirm":{"get":{"tags":["email"],"summary":"Confirm Email","description":"Confirm email address via token link.\n\nThis is a public endpoint (no auth required) - the token itself is the auth.\nRedirects to frontend URL on success or failure.","operationId":"confirm_email_email_confirm_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/payment-methods/":{"get":{"tags":["payment-methods"],"summary":"List Payment Methods","description":"List saved payment methods for the current user.\n\nProxies to Payments Service which resolves Stripe customer\nand returns saved cards.","operationId":"list_payment_methods_payment_methods__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodsResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["payment-methods"],"summary":"Create Payment Method","description":"Create a SetupIntent for adding a new payment method.\n\nReturns client_secret for Stripe Elements to collect card details.\nThis is a generic endpoint - no opportunity is attached.\n\nIf the user has no Stripe customer yet, one is created lazily using\nthe email from the user's account.","operationId":"create_payment_method_payment_methods__post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentMethodResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/internal/proxy":{"post":{"tags":["internal"],"summary":"Proxy To Internal Service","description":"Proxy a request to an internal service.\n\nThis endpoint is only available in staging/development environments.\nRequires user authentication (same as other gateway endpoints).\n\nThe authenticated user's ID is passed to internal services via the\nAxel-User-Id header, so there is no privilege escalation.","operationId":"proxy_to_internal_service_internal_proxy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalProxyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalProxyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/user-check/phone-status":{"get":{"tags":["user-check"],"summary":"Get Phone Status","description":"Check if a phone number exists in the system.\n\nReturns:\n    - status: \"old\" if the phone number exists, \"new\" if it doesn't","operationId":"get_phone_status_user_check_phone_status_get","parameters":[{"name":"phone_number","in":"query","required":true,"schema":{"type":"string","description":"Phone number to check","title":"Phone Number"},"description":"Phone number to check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint - health check.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Root  Get"}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint for monitoring.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check Health Get"}}}}}}}},"components":{"schemas":{"AdFlight":{"properties":{"observation_id":{"type":"string","title":"Observation Id"},"carrier":{"type":"string","title":"Carrier"},"carrier_code":{"type":"string","title":"Carrier Code"},"flight_numbers":{"type":"string","title":"Flight Numbers"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination"},"departure_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Time"},"arrival_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrival Time"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes"},"stops":{"type":"integer","title":"Stops","default":0},"price":{"$ref":"#/components/schemas/AdFlightPrice"},"axel_price_flight_only":{"anyOf":[{"$ref":"#/components/schemas/AdFlightPrice"},{"type":"null"}]},"axel_member_price":{"anyOf":[{"$ref":"#/components/schemas/AdFlightPrice"},{"type":"null"}]},"savings":{"anyOf":[{"$ref":"#/components/schemas/AdFlightPrice"},{"type":"null"}]},"departure_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Token"},"booking_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Token"},"layovers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Layovers"},"tag":{"type":"string","title":"Tag","default":""},"is_pick":{"type":"boolean","title":"Is Pick","default":false}},"type":"object","required":["observation_id","carrier","carrier_code","flight_numbers","price"],"title":"AdFlight"},"AdFlightPrice":{"properties":{"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["amount","currency"],"title":"AdFlightPrice"},"AdHotel":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"name":{"type":"string","title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"review_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Rating"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"price":{"$ref":"#/components/schemas/AdHotelPrice"},"compare_price":{"anyOf":[{"$ref":"#/components/schemas/AdHotelComparePrice"},{"type":"null"}]},"savings":{"anyOf":[{"$ref":"#/components/schemas/AdFlightPrice"},{"type":"null"}]},"savings_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Savings Percent"},"hotel_search_session_id":{"type":"string","title":"Hotel Search Session Id"},"tag":{"type":"string","title":"Tag","default":""},"is_pick":{"type":"boolean","title":"Is Pick","default":false}},"type":"object","required":["hotel_id","name","price","hotel_search_session_id"],"title":"AdHotel"},"AdHotelComparePrice":{"properties":{"nightly_rate":{"$ref":"#/components/schemas/AdFlightPrice"},"total":{"$ref":"#/components/schemas/AdFlightPrice"},"savings_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Savings Percent"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"},"source":{"type":"string","title":"Source","default":"expedia"}},"type":"object","required":["nightly_rate","total"],"title":"AdHotelComparePrice"},"AdHotelDestination":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"destination_type":{"type":"string","title":"Destination Type","default":"city"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"radius_km":{"type":"number","title":"Radius Km"},"confidence":{"type":"string","title":"Confidence","default":"medium"}},"type":"object","required":["name","slug","latitude","longitude","radius_km"],"title":"AdHotelDestination"},"AdHotelPrice":{"properties":{"nightly_rate":{"$ref":"#/components/schemas/AdFlightPrice"},"total":{"$ref":"#/components/schemas/AdFlightPrice"},"is_approximate":{"type":"boolean","title":"Is Approximate","default":false}},"type":"object","required":["nightly_rate","total"],"title":"AdHotelPrice"},"AdPlace":{"properties":{"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"}},"type":"object","required":["name","code"],"title":"AdPlace"},"AddEmailForwardingRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"AddEmailForwardingRequest","description":"Request to add email to forwarding list."},"AddEmailForwardingResponse":{"properties":{"message":{"type":"string","title":"Message"},"email":{"type":"string","title":"Email"}},"type":"object","required":["message","email"],"title":"AddEmailForwardingResponse","description":"Response after requesting to add forwarding email."},"AddIdentityRequest":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"}},"type":"object","title":"AddIdentityRequest","description":"Add email or phone to existing account."},"AirlineCreditOffer":{"properties":{"available":{"type":"boolean","title":"Available"},"credit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"airline_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Name"}},"type":"object","required":["available"],"title":"AirlineCreditOffer","description":"Synthetic airline-credit offer shown after sparse flight import."},"AirlineResult":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"}},"type":"object","required":["code","name"],"title":"AirlineResult","description":"Single airline autocomplete result."},"AmenityGroup":{"properties":{"group_name":{"type":"string","title":"Group Name"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"}},"type":"object","required":["group_name"],"title":"AmenityGroup","description":"Amenities grouped by category (e.g. \"Internet\", \"Recreation\")."},"AttachReferralResponse":{"properties":{"referrer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Referrer Id"},"referrer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Name"},"code":{"type":"string","title":"Code"},"credit_granted_cents":{"type":"integer","title":"Credit Granted Cents"},"already_attached":{"type":"boolean","title":"Already Attached","default":false}},"type":"object","required":["referrer_id","code","credit_granted_cents"],"title":"AttachReferralResponse","description":"Result of attaching a referral code to a user (referee side)."},"AttributionData":{"properties":{"first_touch":{"anyOf":[{"$ref":"#/components/schemas/AttributionTouch"},{"type":"null"}]},"last_touch":{"anyOf":[{"$ref":"#/components/schemas/AttributionTouch"},{"type":"null"}]}},"type":"object","title":"AttributionData","description":"Canonical first-touch / last-touch attribution payload."},"AttributionTouch":{"properties":{"attribution_version":{"type":"integer","title":"Attribution Version","default":2},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At"},"landing_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Path"},"referrer_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Path"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"fbclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid"},"twclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twclid"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"gbraid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gbraid"},"wbraid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wbraid"},"partnership_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partnership Code"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"},"creative_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Id"}},"type":"object","title":"AttributionTouch","description":"A single captured attribution touch."},"BedType":{"type":"string","enum":["king","two_queens","any"],"title":"BedType","description":"Bed type preference for sparse hotel bookings."},"Body_parse_screenshot_bookings_parse_screenshot_post":{"properties":{"image":{"type":"string","contentMediaType":"application/octet-stream","title":"Image"}},"type":"object","required":["image"],"title":"Body_parse_screenshot_bookings_parse_screenshot_post"},"BookingActivityRequest":{"properties":{"event":{"type":"string","title":"Event"},"type":{"type":"string","title":"Type"},"summary":{"type":"string","title":"Summary"},"idx":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idx"},"hotel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hotel Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["event","type","summary"],"title":"BookingActivityRequest"},"BookingClassEvidence":{"properties":{"booking_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Class"},"fare_basis_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Basis Code"},"confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"additionalProperties":true,"type":"object","title":"BookingClassEvidence","description":"Booking-class/fare-basis evidence when shown."},"BookingProvidersResponse":{"properties":{"providers":{"items":{"type":"string"},"type":"array","title":"Providers"}},"type":"object","required":["providers"],"title":"BookingProvidersResponse"},"BookingStatus":{"type":"string","enum":["pending","confirmed","in_progress","cancelled","completed"],"title":"BookingStatus","description":"Lifecycle status of a booking.\n\nDetermines whether booking is actionable for repricing/modification."},"CabinClass":{"type":"string","enum":["economy","premium_economy","business","first"],"title":"CabinClass","description":"Aircraft cabin class."},"CabinEvidence":{"properties":{"cabin_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin Class"},"confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"additionalProperties":true,"type":"object","title":"CabinEvidence","description":"Cabin evidence extracted from supplier/email content."},"CancelBookingRequest":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"},"accept_no_refund":{"type":"boolean","title":"Accept No Refund","default":false},"refund_review_requested":{"type":"boolean","title":"Refund Review Requested","default":false},"better_deal_provider":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Better Deal Provider"},"better_deal_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["reason"],"title":"CancelBookingRequest"},"CancelBookingResponse":{"properties":{"booking_id":{"type":"string","title":"Booking Id"},"booking_type":{"type":"string","const":"hotel","title":"Booking Type"},"status":{"type":"string","title":"Status"},"payment_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Action"},"refund_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Id"}},"type":"object","required":["booking_id","booking_type","status"],"title":"CancelBookingResponse"},"CancelCapability":{"type":"string","enum":["yes","no","unknown"],"title":"CancelCapability","description":"Whether Axel can cancel a booking on behalf of the user.\n\nYES = Axel has credentials/access to cancel\nNO = User must cancel themselves (e.g., booked through third-party OTA)\nUNKNOWN = Not yet verified with operator"},"CardDetails":{"properties":{"id":{"type":"string","title":"Id"},"brand":{"type":"string","title":"Brand"},"last4":{"type":"string","title":"Last4"},"exp_month":{"type":"integer","title":"Exp Month"},"exp_year":{"type":"integer","title":"Exp Year"}},"type":"object","required":["id","brand","last4","exp_month","exp_year"],"title":"CardDetails"},"ChargeDeferredHotelPurchaseResponse":{"properties":{"hotel_purchase_id":{"type":"string","format":"uuid","title":"Hotel Purchase Id"},"action":{"type":"string","title":"Action"},"state":{"type":"string","title":"State"},"charge_attempts":{"type":"integer","title":"Charge Attempts"},"payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"planned_charge_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Charge Date"}},"type":"object","required":["hotel_purchase_id","action","state","charge_attempts"],"title":"ChargeDeferredHotelPurchaseResponse"},"CheckoutAttributionData":{"properties":{"first_touch":{"anyOf":[{"$ref":"#/components/schemas/AttributionTouch"},{"type":"null"}]},"last_touch":{"anyOf":[{"$ref":"#/components/schemas/AttributionTouch"},{"type":"null"}]},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","title":"CheckoutAttributionData","description":"Membership checkout attribution payload."},"CheckoutSignalRequest":{"properties":{"type":{"type":"string","title":"Type"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Observation Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"fare_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Name"},"step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step"},"hotel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hotel Id"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"abandon_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abandon Type"},"mount_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mount Count"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"total_options":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Options"},"outbound_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outbound Observation Id"},"return_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Observation Id"},"fare_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Observation Id"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"wake_token_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wake Token Hash"},"has_wake_token":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Wake Token"},"traveler_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traveler Index"},"pax_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pax Count"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"missing_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Missing Fields"},"error_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Count"},"card_last_four":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last Four"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id"},"result_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Result Count"},"observation_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Observation Ids"},"comparison_frame_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comparison Frame Id"},"hotel_checkout_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Checkout Id"},"room_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Id"},"room_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Room Count"},"had_error":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Had Error"},"quote_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote Id"},"pay_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pay Type"},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"check_in":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out"},"client_ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ts"},"map_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Map Session Id"},"pick_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pick Count"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"final_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Mode"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"panned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Panned"},"filter_used":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Filter Used"},"close_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Close Reason"},"pin_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pin Kind"},"map_open_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Map Open Source"},"display_received_to_hotel_search_map_mount_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Received To Hotel Search Map Mount Ms"},"display_received_to_surface_open_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Received To Surface Open Ms"},"display_received_to_full_map_open_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Received To Full Map Open Ms"},"hotel_search_map_mount_to_full_map_open_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hotel Search Map Mount To Full Map Open Ms"},"surface_open_to_full_map_open_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Surface Open To Full Map Open Ms"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"decline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decline Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"purchase_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchase Id"},"post_commit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Post Commit"},"stripe_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Step"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"active_negotiation_offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Negotiation Offer Id"},"limited_time_offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Limited Time Offer Id"},"receipt_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Id"},"surface_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface Kind"},"render_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Render Source"},"render_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Render Ms"},"card_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Type"}},"additionalProperties":true,"type":"object","required":["type"],"title":"CheckoutSignalRequest"},"ChipScoreHistoryMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","maxLength":1000,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChipScoreHistoryMessage"},"ChipScoreRequest":{"properties":{"text":{"type":"string","maxLength":1000,"title":"Text"},"history":{"items":{"$ref":"#/components/schemas/ChipScoreHistoryMessage"},"type":"array","maxItems":8,"title":"History"}},"type":"object","required":["text"],"title":"ChipScoreRequest"},"CitizenshipSource":{"type":"string","enum":["explicit","passport","imported","unknown"],"title":"CitizenshipSource","description":"How a citizenship value entered the system."},"ClusterBounds":{"properties":{"sw":{"$ref":"#/components/schemas/LatLng"},"ne":{"$ref":"#/components/schemas/LatLng"}},"type":"object","required":["sw","ne"],"title":"ClusterBounds","description":"Bounding box of a hotel cluster — client zooms into this area on click."},"ClusterType":{"type":"string","enum":["loading","grouped"],"title":"ClusterType","description":"Why this cluster exists — informs how the front end renders it."},"ClustersByZoom":{"properties":{"xlow":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"Xlow"},"low":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"Low"},"mid":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"Mid"},"high":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"High"},"xhigh":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"Xhigh"},"xxhigh":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"Xxhigh"}},"type":"object","title":"ClustersByZoom","description":"Precomputed clusters for each zoom band so the FE can switch instantly."},"CodeRedeemResponse":{"properties":{"kind":{"type":"string","enum":["promo","referral"],"title":"Kind"},"promo":{"anyOf":[{"$ref":"#/components/schemas/UserPromoCodeResponse"},{"type":"null"}]},"referral":{"anyOf":[{"$ref":"#/components/schemas/AttachReferralResponse"},{"type":"null"}]}},"type":"object","required":["kind"],"title":"CodeRedeemResponse","description":"Result of redeeming a user-entered code, tagged by namespace."},"CodeValidateResponse":{"properties":{"kind":{"type":"string","enum":["promo","referral","invalid"],"title":"Kind"},"code":{"type":"string","title":"Code"},"promo_discount_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Promo Discount Percent"},"referrer_first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer First Name"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["kind","code"],"title":"CodeValidateResponse","description":"Preview of what a user-entered code is, across both code namespaces."},"ComparePrice":{"properties":{"nightly_rate":{"$ref":"#/components/schemas/Money"},"total":{"$ref":"#/components/schemas/Money"},"savings_percent":{"type":"number","title":"Savings Percent","description":"Fraction saved vs Expedia, e.g. 0.22 = 22%. Negative means ETG is more expensive."},"confidence":{"$ref":"#/components/schemas/ComparePriceConfidence"},"source":{"type":"string","title":"Source","default":"expedia"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Displayed retail provider from the compare source, e.g. Expedia.com."},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"}},"type":"object","required":["nightly_rate","total","savings_percent","confidence"],"title":"ComparePrice","description":"Expedia retail benchmark price for comparison display.\n\nDisplay-only — not bookable. Used to show \"Save X% vs Expedia\"."},"ComparePriceConfidence":{"type":"string","enum":["estimated","cached","live","detail"],"title":"ComparePriceConfidence","description":"Quality tier of compare price data."},"ConfirmPaymentResponse":{"properties":{"hotel_purchase_id":{"type":"string","format":"uuid","title":"Hotel Purchase Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["hotel_purchase_id","status"],"title":"ConfirmPaymentResponse"},"ConfirmationCodeBookingRequest":{"properties":{"confirmation_code":{"type":"string","maxLength":20,"minLength":1,"title":"Confirmation Code"},"booking_provider":{"type":"string","maxLength":100,"minLength":1,"title":"Booking Provider"},"traveler_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Traveler Profile Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Brain trip document UUID from conversation card"}},"type":"object","required":["confirmation_code","booking_provider"],"title":"ConfirmationCodeBookingRequest"},"ContactInfo":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"front_desk_time_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front Desk Time Start"},"front_desk_time_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front Desk Time End"}},"type":"object","title":"ContactInfo","description":"Hotel contact and front-desk information."},"ConversationMessageRequest":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"turn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turn Id"},"entry_context":{"anyOf":[{"$ref":"#/components/schemas/TripFactsWorkflowSubmitEntryContext"},{"$ref":"#/components/schemas/TripSwitchDecisionEntryContext"},{"$ref":"#/components/schemas/HotelMapRefinementEntryContext"},{"$ref":"#/components/schemas/HotelDetailQuestionEntryContext"},{"$ref":"#/components/schemas/FlightGuideMessageEntryContext"},{"type":"null"}],"title":"Entry Context"},"supports_pending_flight_guide":{"type":"boolean","title":"Supports Pending Flight Guide","description":"Client handles pending Flight Guide frames and same-frame recovery.","default":false}},"type":"object","title":"ConversationMessageRequest"},"CreateFlightSupportRequest":{"properties":{"topic":{"$ref":"#/components/schemas/FlightSupportRequestTopic"},"message":{"type":"string","maxLength":500,"minLength":1,"title":"Message"}},"type":"object","required":["topic","message"],"title":"CreateFlightSupportRequest","description":"Customer input for one booking-scoped support request."},"CreateHotelPurchaseRequest":{"properties":{"hotel_search_booking_session_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hotel Search Booking Session Id","description":"Persisted hotel booking session that authoritatively owns replacement intent when provided."},"hotel_purchase_id":{"type":"string","format":"uuid","title":"Hotel Purchase Id","description":"Client-generated UUID for idempotency"},"quote_id":{"type":"string","title":"Quote Id","description":"Quote ID from /prices endpoint"},"hotel_negotiation_offer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hotel Negotiation Offer Id","description":"Active hotel negotiation offer to redeem at its locked customer price."},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id","description":"Stripe payment method ID (pm_xxx). If absent, returns client_secret for inline card entry."},"payment_method_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Payment Method Types","description":"How the deferred Stripe Elements group was configured, e.g. ['card'] (inline pay only). The PaymentIntent is created to match — Stripe rejects confirm on mismatch. Omitted = automatic payment methods."},"guest_rooms":{"items":{"$ref":"#/components/schemas/api__hotel_purchases__GuestRoom"},"type":"array","title":"Guest Rooms","description":"Guest details per room"},"validated_book_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validated Book Hash","description":"Prebook-validated ETG hash from /hotel-purchases/prebook"},"prebook_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prebook Price Cents","description":"Prebooked supplier price in cents"},"prebook_price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prebook Price Currency","description":"Prebooked supplier price currency"},"force_pay_now":{"type":"boolean","title":"Force Pay Now","description":"If true, always use immediate charge (Path A) regardless of cancellation policy.","default":false},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Brain trip document UUID from conversation card"},"replacement_for_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement For Booking Id","description":"Existing hotel booking ID that this new booking is intended to replace."},"retail_total_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retail Total Amount","description":"Expedia retail total in minor units (cents). For savings display in confirmation email."},"retail_total_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retail Total Currency","description":"Currency of retail_total_amount (e.g., 'USD')"},"credit_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Amount Cents","description":"Axel credit to apply (cents). None/omitted=no credit, >0=apply this amount."}},"type":"object","required":["hotel_purchase_id","quote_id","guest_rooms"],"title":"CreateHotelPurchaseRequest"},"CreateHotelPurchaseResponse":{"properties":{"hotel_purchase_id":{"type":"string","format":"uuid","title":"Hotel Purchase Id"},"status":{"type":"string","title":"Status"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"charge_mode":{"type":"string","title":"Charge Mode","default":"immediate"},"credit_applied_cents":{"type":"integer","title":"Credit Applied Cents","default":0}},"type":"object","required":["hotel_purchase_id","status"],"title":"CreateHotelPurchaseResponse"},"CreateHotelSearchSessionRequest":{"properties":{"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"guests":{"$ref":"#/components/schemas/HotelSearchGuestConfig"},"initial_location":{"anyOf":[{"$ref":"#/components/schemas/LocationRadius"},{"type":"null"}]},"anchor":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchAnchor"},{"type":"null"}]},"filters":{"anyOf":[{"$ref":"#/components/schemas/SearchFilters"},{"type":"null"}]}},"type":"object","required":["check_in","check_out","guests"],"title":"CreateHotelSearchSessionRequest","description":"Creates a search session with immutable dates/guests.\n\nOptionally includes an initial_location to get Phase 1 results inline\nwith the session creation response (avoids an extra round-trip)."},"CreatePaymentMethodResponse":{"properties":{"setup_intent_id":{"type":"string","title":"Setup Intent Id"},"client_secret":{"type":"string","title":"Client Secret"},"stripe_customer_id":{"type":"string","title":"Stripe Customer Id"}},"type":"object","required":["setup_intent_id","client_secret","stripe_customer_id"],"title":"CreatePaymentMethodResponse"},"CreateTravelerRequest":{"properties":{"first_name":{"type":"string","title":"First Name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"address_line_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line 1"},"address_line_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line 2"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"address_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country"},"known_traveler_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Known Traveler Number"},"redress_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redress Number"},"citizenship":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship"},"passports":{"items":{"$ref":"#/components/schemas/Passport"},"type":"array","title":"Passports"},"loyalty_memberships":{"items":{"$ref":"#/components/schemas/LoyaltyMembership"},"type":"array","title":"Loyalty Memberships"}},"type":"object","required":["first_name","last_name"],"title":"CreateTravelerRequest","description":"Request to create a traveler."},"CreateTripRequest":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"context":{"type":"string","title":"Context","default":"new_trip"}},"type":"object","title":"CreateTripRequest"},"DescriptionSection":{"properties":{"title":{"type":"string","title":"Title"},"paragraphs":{"items":{"type":"string"},"type":"array","title":"Paragraphs"}},"type":"object","required":["title"],"title":"DescriptionSection","description":"A titled section of descriptive text (e.g. \"Location\", \"Extra info\")."},"DismissFlightSupportRequestResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"dismissed":{"type":"boolean","const":true,"title":"Dismissed"}},"type":"object","required":["id","dismissed"],"title":"DismissFlightSupportRequestResponse","description":"Idempotent acknowledgement of a resolved request."},"EmailForwardingListResponse":{"properties":{"emails":{"items":{"type":"string"},"type":"array","title":"Emails","description":"List of verified email addresses for forwarding"}},"type":"object","required":["emails"],"title":"EmailForwardingListResponse","description":"Response with user's email forwarding list."},"ExactPublicRateComparison":{"properties":{"source":{"type":"string","minLength":1,"title":"Source"},"public_total":{"$ref":"#/components/schemas/Money"},"customer_total":{"$ref":"#/components/schemas/Money"},"savings_bucket_percent":{"type":"integer","multipleOf":10.0,"maximum":90.0,"minimum":10.0,"title":"Savings Bucket Percent"}},"type":"object","required":["source","public_total","customer_total","savings_bucket_percent"],"title":"ExactPublicRateComparison","description":"Fee-normalized proof for the exact public version of this stay."},"ExtensionClientMetricsRequest":{"properties":{"extension_version":{"type":"string","maxLength":32,"minLength":1,"pattern":"^[0-9A-Za-z.\\-]+$","title":"Extension Version"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","maxProperties":64,"minProperties":1,"title":"Counts"}},"type":"object","required":["extension_version","counts"],"title":"ExtensionClientMetricsRequest"},"ExtensionClientMetricsResponse":{"properties":{"accepted":{"type":"boolean","title":"Accepted","default":true}},"type":"object","title":"ExtensionClientMetricsResponse"},"ExtensionCredentialResponse":{"properties":{"credential":{"type":"string","title":"Credential"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["credential","expires_at","scopes"],"title":"ExtensionCredentialResponse","description":"A freshly issued installation credential.\n\nThe raw credential appears only here — the server keeps a hash. The\nexpiry is advisory scheduling data for the client's refresh; the\nserver-side TTL remains the authority."},"ExtensionCredentialRevokeResponse":{"properties":{"revoked":{"type":"boolean","title":"Revoked"}},"type":"object","required":["revoked"],"title":"ExtensionCredentialRevokeResponse"},"ExtensionFlightHandoffRequest":{"properties":{"observation_id":{"type":"string","format":"uuid","title":"Observation Id"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date"}},"type":"object","required":["observation_id"],"title":"ExtensionFlightHandoffRequest"},"ExtensionFlightHandoffResponse":{"properties":{"url":{"type":"string","minLength":1,"title":"Url"}},"type":"object","required":["url"],"title":"ExtensionFlightHandoffResponse"},"ExtensionFlightPriceCheckRequest":{"properties":{"stage":{"$ref":"#/components/schemas/ExtensionFlightPriceCheckStage"},"origin":{"type":"string","maxLength":200,"minLength":1,"title":"Origin"},"destination":{"type":"string","maxLength":200,"minLength":1,"title":"Destination"},"departure_date":{"type":"string","format":"date","title":"Departure Date"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date"},"cabin":{"$ref":"#/components/schemas/CabinClass"},"passengers":{"$ref":"#/components/schemas/PassengerCount"},"results":{"items":{"$ref":"#/components/schemas/ExtensionVisibleFlightResult"},"type":"array","maxItems":100,"minItems":1,"title":"Results"},"source_observation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Source Observation Id"}},"type":"object","required":["stage","origin","destination","departure_date","cabin","passengers","results"],"title":"ExtensionFlightPriceCheckRequest"},"ExtensionFlightPriceCheckResponse":{"properties":{"proofs":{"items":{"$ref":"#/components/schemas/ExtensionFlightPriceProof"},"type":"array","title":"Proofs"}},"type":"object","required":["proofs"],"title":"ExtensionFlightPriceCheckResponse"},"ExtensionFlightPriceCheckStage":{"type":"string","enum":["one_way","round_trip_outbound","round_trip_return","booking_options"],"title":"ExtensionFlightPriceCheckStage"},"ExtensionFlightPriceProof":{"properties":{"client_result_id":{"type":"string","title":"Client Result Id"},"observation_id":{"type":"string","format":"uuid","title":"Observation Id"},"axel_price":{"$ref":"#/components/schemas/Money"},"axel_price_usd":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"axel_member_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"axel_member_price_usd":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["client_result_id","observation_id","axel_price"],"title":"ExtensionFlightPriceProof"},"ExtensionRemoteConfigResponse":{"properties":{"config_version":{"type":"integer","minimum":0.0,"title":"Config Version"},"kill_switch":{"type":"boolean","title":"Kill Switch"},"dom_profile_overrides":{"additionalProperties":{"anyOf":[{"type":"string"},{"additionalProperties":{"type":"string"},"type":"object"}]},"type":"object","title":"Dom Profile Overrides","default":{}},"price_check_budgets_ms":{"additionalProperties":{"type":"integer"},"type":"object","title":"Price Check Budgets Ms","default":{}}},"type":"object","required":["config_version","kill_switch"],"title":"ExtensionRemoteConfigResponse"},"ExtensionVisibleFlightResult":{"properties":{"client_result_id":{"type":"string","maxLength":128,"minLength":1,"title":"Client Result Id"},"google_price":{"$ref":"#/components/schemas/Money"},"segments":{"items":{"$ref":"#/components/schemas/FlightRepriceSegmentRequirement"},"type":"array","maxItems":6,"minItems":1,"title":"Segments"},"return_segments":{"anyOf":[{"items":{"$ref":"#/components/schemas/FlightRepriceSegmentRequirement"},"type":"array","maxItems":6,"minItems":1},{"type":"null"}],"title":"Return Segments"},"fare_family_label":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Fare Family Label"}},"type":"object","required":["client_result_id","google_price","segments"],"title":"ExtensionVisibleFlightResult"},"FareBaggagePolicy":{"properties":{"source":{"type":"string","enum":["serpapi_google_flights","unknown"],"title":"Source","default":"unknown"},"quotes":{"items":{"$ref":"#/components/schemas/FareBaggageQuote"},"type":"array","title":"Quotes"}},"type":"object","title":"FareBaggagePolicy","description":"Structured fare baggage policy, with raw supplier text preserved."},"FareBaggageQuote":{"properties":{"bag_type":{"type":"string","enum":["personal_item","carry_on","checked","checked_first","checked_second","unknown"],"title":"Bag Type","default":"unknown"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity","description":"Bag count when the supplier text states one; 0 for explicit restrictions."},"is_included":{"type":"boolean","title":"Is Included","default":false},"is_restriction":{"type":"boolean","title":"Is Restriction","default":false},"fee_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fee Amount"},"fee_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Currency"},"fee_basis":{"type":"string","enum":["round_trip","one_way","per_segment","unknown"],"title":"Fee Basis","default":"unknown"},"pax_basis":{"type":"string","enum":["per_pax","total","unknown"],"title":"Pax Basis","default":"unknown"},"fee_amount_per_direction":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fee Amount Per Direction","description":"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":{"type":"string","enum":["together","departing","returning","unknown"],"title":"Source Key","default":"unknown"},"raw_text":{"type":"string","title":"Raw Text"}},"type":"object","required":["raw_text"],"title":"FareBaggageQuote","description":"A single baggage policy quote from a fare-shopping supplier."},"FareConfidence":{"type":"string","enum":["exact","likely_equivalent","possible_downgrade","unverified"],"title":"FareConfidence","description":"Operator-facing confidence for fare-family equivalence."},"FareEvidenceKind":{"type":"string","enum":["fare_product","seat_extra","noise"],"title":"FareEvidenceKind","description":"Type of evidence captured from parser or supplier data."},"FareEvidenceStatus":{"type":"string","enum":["not_attempted","parsed","parse_failed","source_unavailable"],"title":"FareEvidenceStatus","description":"Whether fare evidence parsing was attempted and why it may be absent."},"FareFamilyEvidence":{"properties":{"raw_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Label"},"normalized_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Label"},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id"},"fare_family_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Label"},"fare_family_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Source"},"base_fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Fare Family Id"},"base_fare_family_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Fare Family Label"},"variant_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant Status"},"candidate_fare_family_ids":{"items":{"type":"string"},"type":"array","title":"Candidate Fare Family Ids"},"fare_confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"},"fare_evidence_status":{"$ref":"#/components/schemas/FareEvidenceStatus","default":"not_attempted"},"requires_operator_fare_verification":{"type":"boolean","title":"Requires Operator Fare Verification","default":true},"blocker_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocker Reason"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Id"},"parser_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parser Version"},"raw_google_option_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Google Option Title"},"option_title_present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Option Title Present"},"option_title_missing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Option Title Missing"},"fallback_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Label"},"fallback_label_used":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fallback Label Used"},"fallback_label_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Label Source"},"canonicalizer_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonicalizer Status"},"canonicalizer_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonicalizer Reason"},"selected_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Observation Id"},"content_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Observation Id"},"evidence_kind":{"anyOf":[{"$ref":"#/components/schemas/FareEvidenceKind"},{"type":"null"}]},"seat_extras":{"items":{"$ref":"#/components/schemas/SeatExtraEvidence"},"type":"array","title":"Seat Extras"},"possible_downgrade_reasons":{"items":{"type":"string"},"type":"array","title":"Possible Downgrade Reasons"},"segments":{"items":{"$ref":"#/components/schemas/SegmentFareEvidence"},"type":"array","title":"Segments"},"raw":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Raw"}},"additionalProperties":true,"type":"object","title":"FareFamilyEvidence","description":"Structured fare evidence persisted for booking/admin workflows."},"FareProductEvidence":{"properties":{"raw_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Label"},"normalized_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Label"},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id"},"fare_family_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Label"},"fare_family_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Source"},"base_fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Fare Family Id"},"base_fare_family_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Fare Family Label"},"variant_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant Status"},"candidate_fare_family_ids":{"items":{"type":"string"},"type":"array","title":"Candidate Fare Family Ids"},"fare_confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"},"requires_operator_fare_verification":{"type":"boolean","title":"Requires Operator Fare Verification","default":true},"blocker_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocker Reason"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"},"source_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Text"},"rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Id"},"canonicalizer_rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonicalizer Rule Id"},"raw_google_option_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Google Option Title"},"option_title_present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Option Title Present"},"option_title_missing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Option Title Missing"},"fallback_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Label"},"fallback_label_used":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fallback Label Used"},"fallback_label_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Label Source"},"canonicalizer_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonicalizer Status"},"canonicalizer_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonicalizer Reason"},"selected_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Observation Id"},"content_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Observation Id"},"llm_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Context"},"llm_evidence_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Evidence Text"},"verifier_decision":{"anyOf":[{"$ref":"#/components/schemas/VerifierDecision"},{"type":"null"}]},"verifier_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verifier Reason"},"verifier_reasons":{"items":{"type":"string"},"type":"array","title":"Verifier Reasons"},"human_review_required":{"type":"boolean","title":"Human Review Required","default":false},"trusted_for_repricing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trusted For Repricing"}},"additionalProperties":true,"type":"object","title":"FareProductEvidence","description":"Base fare product/fare-family evidence."},"FlagResponse":{"properties":{"name":{"type":"string","title":"Name"},"value":{"type":"boolean","title":"Value"}},"type":"object","required":["name","value"],"title":"FlagResponse"},"FlagsListResponse":{"properties":{"flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Flags"}},"type":"object","required":["flags"],"title":"FlagsListResponse"},"FlightAdCuration":{"properties":{"take":{"type":"string","title":"Take","default":""},"context":{"type":"string","title":"Context","default":""}},"type":"object","title":"FlightAdCuration"},"FlightAdDealResponse":{"properties":{"deal_type":{"type":"string","const":"flight","title":"Deal Type","default":"flight"},"route_slug":{"type":"string","title":"Route Slug"},"origin":{"$ref":"#/components/schemas/AdPlace"},"destination":{"$ref":"#/components/schemas/AdPlace"},"defaults":{"$ref":"#/components/schemas/FlightSearchDefaults"},"searched_at":{"type":"string","format":"date","title":"Searched At"},"observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observed At"},"flights_checked":{"type":"integer","title":"Flights Checked"},"filtered_count":{"type":"integer","title":"Filtered Count","default":0},"price_insights":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price Insights"},"intro_message":{"type":"string","title":"Intro Message","default":"Hey, I’m Axel. I’m your AI travel agent and I want to save you money (for free).\n\nI find hidden flight and hotel deals, then keep working to save you money even after you book.\n\nLoading live options for you now. Want to change dates, budget, or anything else? Message me and let's get this trip booked."},"curation":{"$ref":"#/components/schemas/FlightAdCuration"},"flights":{"items":{"$ref":"#/components/schemas/AdFlight"},"type":"array","title":"Flights"}},"type":"object","required":["route_slug","origin","destination","defaults","searched_at","flights_checked","curation","flights"],"title":"FlightAdDealResponse"},"FlightAdHandoffRequest":{"properties":{"engagement_type":{"type":"string","enum":["chat","deal"],"title":"Engagement Type"},"ad_context":{"$ref":"#/components/schemas/FlightAdDealResponse"},"user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message"},"selected_flight":{"anyOf":[{"$ref":"#/components/schemas/SelectedAdFlight"},{"type":"null"}]}},"type":"object","required":["engagement_type","ad_context"],"title":"FlightAdHandoffRequest"},"FlightAncillaryBagOption":{"properties":{"product_id":{"type":"string","title":"Product Id"},"display_name":{"type":"string","title":"Display Name"},"segment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Id"},"segment_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"checked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Checked"},"cabin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cabin"},"weight":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weight"},"dimensions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimensions"},"quantity_min":{"type":"integer","title":"Quantity Min","default":0},"quantity_max":{"type":"integer","title":"Quantity Max","default":1},"price_by_passenger":{"additionalProperties":{"$ref":"#/components/schemas/FlightAncillaryBagPassengerPrice"},"type":"object","title":"Price By Passenger"}},"type":"object","required":["product_id","display_name"],"title":"FlightAncillaryBagOption","description":"Normalized Gordian bag product that Axel can render directly."},"FlightAncillaryBagPassengerPrice":{"properties":{"amount_cents":{"type":"integer","title":"Amount Cents","default":0},"currency":{"type":"string","title":"Currency","default":"USD"},"available":{"type":"boolean","title":"Available","default":true},"tiers":{"items":{"$ref":"#/components/schemas/FlightAncillaryBagPriceTier"},"type":"array","title":"Tiers"}},"type":"object","title":"FlightAncillaryBagPassengerPrice","description":"Bag price/availability for a single Gordian passenger.\n\n``amount_cents`` is the quantity-1 price. ``tiers`` holds the full\nper-quantity price curve when the search response provides one; its\nhighest available quantity is the passenger's purchase limit."},"FlightAncillaryBagPriceTier":{"properties":{"quantity":{"type":"integer","title":"Quantity"},"amount_cents":{"type":"integer","title":"Amount Cents"},"available":{"type":"boolean","title":"Available","default":true}},"type":"object","required":["quantity","amount_cents"],"title":"FlightAncillaryBagPriceTier","description":"Cumulative price for buying ``quantity`` units of one bag product.\n\nGordian's search response lists one entry per purchasable quantity with\nthe CUMULATIVE total (e.g. checked bag: 1 -> $79, 2 -> $168, 3 -> $318);\nthe marginal cost of each additional bag is the delta between tiers."},"FlightAncillaryBagSelectionItem":{"properties":{"product_id":{"type":"string","title":"Product Id"},"passenger_id":{"type":"string","title":"Passenger Id"},"traveler_profile_id":{"type":"string","format":"uuid","title":"Traveler Profile Id"},"quantity":{"type":"integer","title":"Quantity","default":1}},"type":"object","required":["product_id","passenger_id","traveler_profile_id"],"title":"FlightAncillaryBagSelectionItem","description":"Bag product selected by an Axel-rendered checkout UI."},"FlightAncillaryBagSelectionUpdate":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FlightAncillaryBagSelectionItem"},"type":"array","title":"Items"}},"type":"object","title":"FlightAncillaryBagSelectionUpdate","description":"Replace the current Gordian bag selections for a checkout session."},"FlightAncillaryBasketUpdate":{"properties":{"basket":{"additionalProperties":true,"type":"object","title":"Basket"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"total_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Amount Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"trip_state_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip State Hash"}},"type":"object","title":"FlightAncillaryBasketUpdate","description":"Persist the latest Gordian basket snapshot from the SDK."},"FlightAncillaryItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"product_type":{"type":"string","title":"Product Type"},"passenger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Passenger Id"},"traveler_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Traveler Profile Id"},"segment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"seat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seat"},"quantity":{"type":"integer","title":"Quantity","default":1},"amount_cents":{"type":"integer","title":"Amount Cents","default":0},"currency":{"type":"string","title":"Currency","default":"USD"},"validity_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validity Status"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"}},"type":"object","required":["product_type"],"title":"FlightAncillaryItem","description":"Normalized ancillary line item selected in the Gordian basket.\n\n``amount_cents`` is the LINE TOTAL for the full ``quantity`` — never a\nper-unit price. Gordian prices bag quantities on a cumulative tier curve\n(2nd/3rd bags cost more), so a per-unit price does not exist at\n``quantity > 1``; totals must never multiply ``amount_cents`` by\n``quantity``."},"FlightAncillaryOptionsResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"supported":{"type":"boolean","title":"Supported","default":true},"bag_supported":{"type":"boolean","title":"Bag Supported","default":true},"seat_supported":{"type":"boolean","title":"Seat Supported","default":true},"provider":{"type":"string","const":"gordian","title":"Provider","default":"gordian"},"status":{"type":"string","enum":["not_started","not_configured","unsupported","prewarming","ready","checking","failed","validated"],"title":"Status"},"travelers":{"items":{"$ref":"#/components/schemas/FlightAncillaryTravelerOption"},"type":"array","title":"Travelers"},"bags":{"items":{"$ref":"#/components/schemas/FlightAncillaryBagOption"},"type":"array","title":"Bags"},"seats":{"items":{"$ref":"#/components/schemas/FlightAncillarySeatOption"},"type":"array","title":"Seats"},"seatmaps":{"items":{"$ref":"#/components/schemas/FlightAncillarySeatmap"},"type":"array","title":"Seatmaps"},"seat_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seat Status"},"selected_items":{"items":{"$ref":"#/components/schemas/FlightAncillaryItem"},"type":"array","title":"Selected Items"},"total_amount_cents":{"type":"integer","title":"Total Amount Cents","default":0},"currency":{"type":"string","title":"Currency","default":"USD"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["enabled","status"],"title":"FlightAncillaryOptionsResponse","description":"Axel-renderable ancillary options for the checkout session."},"FlightAncillarySeatCategory":{"properties":{"seat_category_id":{"type":"string","title":"Seat Category Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"price_min_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Min Cents"},"price_max_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Max Cents"}},"type":"object","required":["seat_category_id"],"title":"FlightAncillarySeatCategory","description":"Seatmap legend entry (Standard / Preferred / Extra Legroom ...)."},"FlightAncillarySeatOption":{"properties":{"product_id":{"type":"string","title":"Product Id"},"display_name":{"type":"string","title":"Display Name"},"seat":{"type":"string","title":"Seat"},"segment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Id"},"segment_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Label"},"price_by_passenger":{"additionalProperties":{"$ref":"#/components/schemas/FlightAncillarySeatPassengerPrice"},"type":"object","title":"Price By Passenger"}},"type":"object","required":["product_id","display_name","seat"],"title":"FlightAncillarySeatOption","description":"Normalized Gordian seat product that Axel can render directly.\n\nGeometry (which cell this seat occupies, characteristics, category) lives\non the seatmap; options carry the purchasable identity + pricing and are\njoined to cells by ``product_id``."},"FlightAncillarySeatPassengerPrice":{"properties":{"amount_cents":{"type":"integer","title":"Amount Cents","default":0},"currency":{"type":"string","title":"Currency","default":"USD"},"available":{"type":"boolean","title":"Available","default":true}},"type":"object","title":"FlightAncillarySeatPassengerPrice","description":"Seat price/availability for a single Gordian passenger.\n\nSeats are flat single-price products (quantity is always 1, no tier\ncurve). ``amount_cents == 0`` is a real price — legacy carriers sell free\nstandard seat selection through the same shape (e.g. Delta Main, Alaska\nMain)."},"FlightAncillarySeatSelectionItem":{"properties":{"product_id":{"type":"string","title":"Product Id"},"passenger_id":{"type":"string","title":"Passenger Id"},"traveler_profile_id":{"type":"string","format":"uuid","title":"Traveler Profile Id"}},"type":"object","required":["product_id","passenger_id","traveler_profile_id"],"title":"FlightAncillarySeatSelectionItem","description":"Seat product selected by an Axel-rendered checkout seatmap.\n\nQuantity is intentionally absent — a seat is always exactly one unit for\none passenger."},"FlightAncillarySeatSelectionUpdate":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FlightAncillarySeatSelectionItem"},"type":"array","title":"Items"}},"type":"object","title":"FlightAncillarySeatSelectionUpdate","description":"Replace the current Gordian seat selections for a checkout session."},"FlightAncillarySeatmap":{"properties":{"segment_id":{"type":"string","title":"Segment Id"},"segment_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Label"},"cabin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin"},"columns":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Columns"},"rows":{"items":{"$ref":"#/components/schemas/FlightAncillarySeatmapRow"},"type":"array","title":"Rows"},"categories":{"items":{"$ref":"#/components/schemas/FlightAncillarySeatCategory"},"type":"array","title":"Categories"}},"type":"object","required":["segment_id"],"title":"FlightAncillarySeatmap","description":"Renderable cabin map for one flight segment."},"FlightAncillarySeatmapCell":{"properties":{"seat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seat"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"seat_category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seat Category Id"},"available":{"type":"boolean","title":"Available","default":false},"characteristics":{"items":{"type":"string"},"type":"array","title":"Characteristics"}},"type":"object","title":"FlightAncillarySeatmapCell","description":"One position in a seatmap row group.\n\n``seat`` is None for structural gaps (missing seat at this column).\n``available`` is False for occupied or not-offered seats — the FE renders\nthem, greyed, but they carry no purchasable product for this fare."},"FlightAncillarySeatmapRow":{"properties":{"row":{"type":"string","title":"Row"},"exit_row":{"type":"boolean","title":"Exit Row","default":false},"groups":{"items":{"items":{"$ref":"#/components/schemas/FlightAncillarySeatmapCell"},"type":"array"},"type":"array","title":"Groups"}},"type":"object","required":["row"],"title":"FlightAncillarySeatmapRow"},"FlightAncillarySessionResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"supported":{"type":"boolean","title":"Supported","default":true},"bag_supported":{"type":"boolean","title":"Bag Supported","default":true},"seat_supported":{"type":"boolean","title":"Seat Supported","default":true},"provider":{"type":"string","const":"gordian","title":"Provider","default":"gordian"},"status":{"type":"string","enum":["not_started","not_configured","unsupported","prewarming","ready","checking","failed","validated"],"title":"Status"},"trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip Id"},"trip_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"search_ids":{"additionalProperties":{"type":"string"},"type":"object","title":"Search Ids"},"sdk_url":{"type":"string","title":"Sdk Url","default":"https://sdk.gordiansoftware.com/javascript/v2.2/gordian.min.js"},"selected_items":{"items":{"$ref":"#/components/schemas/FlightAncillaryItem"},"type":"array","title":"Selected Items"},"total_amount_cents":{"type":"integer","title":"Total Amount Cents","default":0},"currency":{"type":"string","title":"Currency","default":"USD"},"trip_state_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip State Hash"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["enabled","status"],"title":"FlightAncillarySessionResponse","description":"Current Gordian ancillary state for a flight booking session."},"FlightAncillaryTravelerOption":{"properties":{"traveler_profile_id":{"type":"string","format":"uuid","title":"Traveler Profile Id"},"passenger_id":{"type":"string","title":"Passenger Id"},"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["traveler_profile_id","passenger_id","display_name"],"title":"FlightAncillaryTravelerOption","description":"Traveler mapped to a Gordian passenger for ancillary selection."},"FlightAncillaryValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"status":{"type":"string","enum":["not_started","not_configured","unsupported","prewarming","ready","checking","failed","validated"],"title":"Status"},"selected_items":{"items":{"$ref":"#/components/schemas/FlightAncillaryItem"},"type":"array","title":"Selected Items"},"total_amount_cents":{"type":"integer","title":"Total Amount Cents","default":0},"currency":{"type":"string","title":"Currency","default":"USD"},"trip_state_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip State Hash"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"repriced":{"type":"boolean","title":"Repriced","default":false},"previous_total_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Total Amount Cents","description":"Customer ancillary total before this recheck, cents."},"customer_total_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Customer Total Amount Cents","description":"What the customer will actually pay for the selected ancillaries — equals total_amount_cents unless an active fare hold locks lines below the live price."}},"type":"object","required":["valid","status"],"title":"FlightAncillaryValidateResponse","description":"Result of validating selected ancillaries before payment."},"FlightBookingData-Input":{"properties":{"booking_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Channel","description":"direct, ota, corporate, agent, other"},"booking_provider":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Booking Provider","description":"e.g., Priceline, Delta, Expedia, etc"},"airline":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Airline","description":"Primary airline name for the booking, e.g., 'United Airlines', 'Delta Air Lines'"},"airline_code":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Airline Code","description":"IATA airline code, e.g., 'UA', 'DL', 'AA'"},"origin_airport":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Origin Airport","description":"IATA airport code for first departure of the trip, e.g., 'JFK', 'LAX'"},"destination_airport":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Destination Airport","description":"IATA airport code for outbound destination (where you're going), e.g., 'JFK', 'LAX'"},"departure_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Departure Time","description":"Departure time of first flight in ISO 8601 format with timezone, e.g., '2024-03-15T14:30:00-05:00'"},"arrival_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Arrival Time","description":"Arrival time of final flight in ISO 8601 format with timezone, e.g., '2024-03-15T18:45:00-08:00'"},"cabin_class":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Cabin Class","description":"economy, premium_economy, business, first"},"fare_family":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family","description":"Fare family / fare brand for the booking when shown (e.g., 'Main Cabin', 'Delta One')."},"fare_family_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family Id","description":"Canonical fare family ID for the booking when resolved."},"fare_family_label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Fare Family Label","description":"Source/display fare family label for the booking."},"fare_family_source":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Fare Family Source","description":"How the booking fare family was captured."},"fare_family_resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fare Family Resolved At","description":"When the fare family label was resolved to the canonical ID."},"fare_family_blocker_reason":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family Blocker Reason","description":"Structured blocker reason when fare family cannot support direct repricing."},"fare_family_evidence":{"anyOf":[{"$ref":"#/components/schemas/FareFamilyEvidence"},{"type":"null"}],"description":"Structured parser/supplier evidence for fare-family confidence."},"flight_parse_evidence":{"anyOf":[{"$ref":"#/components/schemas/FlightParseEvidence"},{"type":"null"}],"description":"Structured flight parser evidence, including fare product, cabin, extras, and LLM audit metadata."},"booking_class":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Booking Class","description":"Optional booking class / fare code if shown (e.g., 'Y', 'B', 'M', 'J')."},"cash_paid":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid","description":"Cash amount paid as displayed in the email (e.g., 149.99 for $149.99, 15000 for ¥15000). For award bookings, this is taxes/fees only. For mixed bookings, this is the cash portion. No currency symbol, no thousands separator. Normalize locale formats: US '1,234.56' or European '1.234,56' → output 1234.56"},"cash_currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Cash Currency","description":"ISO 4217 currency code for cash_paid, e.g., 'USD', 'EUR', 'JPY', 'CLP'"},"checked_bags_included":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checked Bags Included","description":"Number of checked bags included in the fare. Null if not mentioned in the email."},"carry_on_bags_included":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Carry On Bags Included","description":"Number of carry-on bags included in the fare. Baggage policy sections count (e.g., 'limited to one carry-on' = 1). Null if not mentioned."},"is_award_booking":{"type":"boolean","title":"Is Award Booking","description":"True if flight was booked using miles/points (even partially). Look for phrases like 'Award booking', 'Redeemed miles', 'Points redemption', or mile/point amounts in the price breakdown.","default":false},"loyalty_program":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Loyalty Program","description":"Frequent flyer program name, e.g., 'Mileage Plan', 'MileagePlus', 'SkyMiles', 'AAdvantage'. Only set if the passenger has an account linked to this booking. Do not set based on promotional content or 'Join now' messaging."},"loyalty_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Loyalty Number","description":"Frequent flyer account number shown in the booking, if any."},"miles_paid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Miles Paid","description":"Number of miles/points redeemed for the booking. Only set if is_award_booking is true. Integer value, no decimals."},"airline_credit_applied":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Airline Credit Applied","description":"Airline travel credit or voucher applied to the booking, as displayed (e.g., 194.20 for $194.20). Look for 'Travel credit', 'Voucher', 'Flight credit', 'My wallet' in payment breakdown."},"record_locator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Locator","description":"PNR/confirmation code, e.g., 'ABC123'"},"booked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Booked At","description":"Date/time when the booking was made, in ISO 8601 format"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Cancelled At","description":"Date/time when the booking was cancelled, if applicable"},"flights":{"anyOf":[{"items":{"$ref":"#/components/schemas/FlightCreate"},"type":"array"},{"type":"null"}],"title":"Flights","description":"Individual flight segments/legs"},"passengers":{"anyOf":[{"items":{"$ref":"#/components/schemas/PassengerInput"},"type":"array"},{"type":"null"}],"title":"Passengers","description":"Passengers on this booking"}},"type":"object","title":"FlightBookingData","description":"Base schema containing all flight booking fields.\n\nThis is the shared contract for flight booking data across services.\nThe email parser cannot resolve user_id from email content, so user_id\nlives in FlightBookingCreate which inherits from this class."},"FlightBookingData-Output":{"properties":{"booking_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Channel","description":"direct, ota, corporate, agent, other"},"booking_provider":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Booking Provider","description":"e.g., Priceline, Delta, Expedia, etc"},"airline":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Airline","description":"Primary airline name for the booking, e.g., 'United Airlines', 'Delta Air Lines'"},"airline_code":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Airline Code","description":"IATA airline code, e.g., 'UA', 'DL', 'AA'"},"origin_airport":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Origin Airport","description":"IATA airport code for first departure of the trip, e.g., 'JFK', 'LAX'"},"destination_airport":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Destination Airport","description":"IATA airport code for outbound destination (where you're going), e.g., 'JFK', 'LAX'"},"departure_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Departure Time","description":"Departure time of first flight in ISO 8601 format with timezone, e.g., '2024-03-15T14:30:00-05:00'"},"arrival_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Arrival Time","description":"Arrival time of final flight in ISO 8601 format with timezone, e.g., '2024-03-15T18:45:00-08:00'"},"cabin_class":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Cabin Class","description":"economy, premium_economy, business, first"},"fare_family":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family","description":"Fare family / fare brand for the booking when shown (e.g., 'Main Cabin', 'Delta One')."},"fare_family_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family Id","description":"Canonical fare family ID for the booking when resolved."},"fare_family_label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Fare Family Label","description":"Source/display fare family label for the booking."},"fare_family_source":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Fare Family Source","description":"How the booking fare family was captured."},"fare_family_resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fare Family Resolved At","description":"When the fare family label was resolved to the canonical ID."},"fare_family_blocker_reason":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family Blocker Reason","description":"Structured blocker reason when fare family cannot support direct repricing."},"fare_family_evidence":{"anyOf":[{"$ref":"#/components/schemas/FareFamilyEvidence"},{"type":"null"}],"description":"Structured parser/supplier evidence for fare-family confidence."},"flight_parse_evidence":{"anyOf":[{"$ref":"#/components/schemas/FlightParseEvidence"},{"type":"null"}],"description":"Structured flight parser evidence, including fare product, cabin, extras, and LLM audit metadata."},"booking_class":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Booking Class","description":"Optional booking class / fare code if shown (e.g., 'Y', 'B', 'M', 'J')."},"cash_paid":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid","description":"Cash amount paid as displayed in the email (e.g., 149.99 for $149.99, 15000 for ¥15000). For award bookings, this is taxes/fees only. For mixed bookings, this is the cash portion. No currency symbol, no thousands separator. Normalize locale formats: US '1,234.56' or European '1.234,56' → output 1234.56"},"cash_currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Cash Currency","description":"ISO 4217 currency code for cash_paid, e.g., 'USD', 'EUR', 'JPY', 'CLP'"},"checked_bags_included":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checked Bags Included","description":"Number of checked bags included in the fare. Null if not mentioned in the email."},"carry_on_bags_included":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Carry On Bags Included","description":"Number of carry-on bags included in the fare. Baggage policy sections count (e.g., 'limited to one carry-on' = 1). Null if not mentioned."},"is_award_booking":{"type":"boolean","title":"Is Award Booking","description":"True if flight was booked using miles/points (even partially). Look for phrases like 'Award booking', 'Redeemed miles', 'Points redemption', or mile/point amounts in the price breakdown.","default":false},"loyalty_program":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Loyalty Program","description":"Frequent flyer program name, e.g., 'Mileage Plan', 'MileagePlus', 'SkyMiles', 'AAdvantage'. Only set if the passenger has an account linked to this booking. Do not set based on promotional content or 'Join now' messaging."},"loyalty_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Loyalty Number","description":"Frequent flyer account number shown in the booking, if any."},"miles_paid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Miles Paid","description":"Number of miles/points redeemed for the booking. Only set if is_award_booking is true. Integer value, no decimals."},"airline_credit_applied":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Airline Credit Applied","description":"Airline travel credit or voucher applied to the booking, as displayed (e.g., 194.20 for $194.20). Look for 'Travel credit', 'Voucher', 'Flight credit', 'My wallet' in payment breakdown."},"record_locator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Locator","description":"PNR/confirmation code, e.g., 'ABC123'"},"booked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Booked At","description":"Date/time when the booking was made, in ISO 8601 format"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Cancelled At","description":"Date/time when the booking was cancelled, if applicable"},"flights":{"anyOf":[{"items":{"$ref":"#/components/schemas/FlightCreate"},"type":"array"},{"type":"null"}],"title":"Flights","description":"Individual flight segments/legs"},"passengers":{"anyOf":[{"items":{"$ref":"#/components/schemas/PassengerInput"},"type":"array"},{"type":"null"}],"title":"Passengers","description":"Passengers on this booking"}},"type":"object","title":"FlightBookingData","description":"Base schema containing all flight booking fields.\n\nThis is the shared contract for flight booking data across services.\nThe email parser cannot resolve user_id from email content, so user_id\nlives in FlightBookingCreate which inherits from this class."},"FlightBookingDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"status":{"type":"string","title":"Status"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_axel_booked":{"type":"boolean","title":"Is Axel Booked","description":"True if booked through Axel (booking_channel='axel')","default":false},"booking_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Channel"},"booking_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Provider"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"origin_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin City"},"destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination"},"destination_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination City"},"departure_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Departure Date"},"departure_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Departure Time"},"arrival_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Arrival Time"},"is_round_trip":{"type":"boolean","title":"Is Round Trip","default":false},"cabin_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin Class"},"airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Code"},"airline_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Name"},"travelers":{"items":{"type":"string"},"type":"array","title":"Travelers","description":"Traveler names"},"total_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"is_award_booking":{"type":"boolean","title":"Is Award Booking","default":false},"reprice_capability":{"anyOf":[{"$ref":"#/components/schemas/RepriceCapability"},{"type":"null"}]},"credit_secured":{"anyOf":[{"$ref":"#/components/schemas/SavingsSecured"},{"type":"null"}]},"airline_credit_offer":{"anyOf":[{"$ref":"#/components/schemas/AirlineCreditOffer"},{"type":"null"}]}},"type":"object","required":["id","user_id","status","confirmation_code","created_at","updated_at"],"title":"FlightBookingDetailResponse","description":"Enriched flight booking detail for client."},"FlightBookingFareHoldPreviewResponse":{"properties":{"applies":{"type":"boolean","title":"Applies"},"hold_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hold Id"},"held_total_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Held Total Cents"},"live_total_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Live Total Cents"},"charge_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Charge Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["applies"],"title":"FlightBookingFareHoldPreviewResponse","description":"What /pay would charge right now, given the trip's fare hold (FAC-940).\n\nComputed by the same resolution the charge path runs (identity match, pax,\ncurrency, fare-space min(held, live) + locked items) so a hold diagnosis\ncan cite the charge path's own answer instead of guessing from raw data.\nRead-only: never consumes, stamps, or emits redemption telemetry."},"FlightBookingOption":{"properties":{"observation_id":{"type":"string","title":"Observation Id","description":"Content DB observation ID for this fare option"},"fare_name":{"type":"string","title":"Fare Name","description":"Fare family display name (e.g. 'Main Cabin')"},"price":{"$ref":"#/components/schemas/Money","description":"Total price for all passengers"},"price_per_person":{"$ref":"#/components/schemas/Money","description":"Per-passenger price"},"flight_only_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Exact all-passenger flight-only discounted price."},"flight_only_price_per_person":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Flight-only discounted price per passenger"},"member_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"All-passenger member-tier price for this fare option."},"member_price_per_person":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Member-tier price per passenger."},"savings_share_prices":{"anyOf":[{"$ref":"#/components/schemas/FlightSavingsSharePrices"},{"type":"null"}]},"limited_time_offer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Limited Time Offer Id","description":"Active limited-time Axel offer applied to this fare option."},"limited_time_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"All-passenger locked limited-time price for this fare option."},"limited_time_price_per_person":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Per-passenger locked limited-time price for this fare option."},"limited_time_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Limited Time Expires At","description":"When the locked limited-time offer expires."},"limited_time_locked":{"type":"boolean","title":"Limited Time Locked","description":"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.","default":false},"fare_hold_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Hold Id","description":"Active fare hold whose held price applies to this option."},"fare_hold_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"All-passenger held total the charge path will honor."},"fare_hold_price_per_person":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Per-passenger held price for this fare option."},"fare_hold_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fare Hold Expires At","description":"When the free 24h fare hold lapses."},"bundle_price_per_person":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Lower hotel-intent flight price per passenger, applied before optional hotel selection; it does not require a hotel booking."},"baggage":{"items":{"type":"string"},"type":"array","title":"Baggage"},"baggage_policy":{"anyOf":[{"$ref":"#/components/schemas/FareBaggagePolicy"},{"type":"null"}],"description":"Structured fare baggage policy; additive to legacy baggage strings."},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"book_with":{"type":"string","title":"Book With","description":"Booking channel (e.g. 'Delta Air Lines')","default":""},"separate_tickets":{"type":"boolean","title":"Separate Tickets","default":false},"raw_option_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Option Title","description":"Raw Google/SerpAPI fare option title when supplied."},"option_title_present":{"type":"boolean","title":"Option Title Present","description":"Whether the supplier supplied a fare option title.","default":false},"fallback_label_used":{"type":"boolean","title":"Fallback Label Used","description":"Whether fare_name is a cabin/default fallback instead of supplier text.","default":false},"fallback_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Label"},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id"},"fare_family_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Source"},"fare_family_blocker_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Blocker Reason"},"source_evidence":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Evidence","description":"Selected fare evidence carried from Content observation."}},"type":"object","required":["observation_id","fare_name","price","price_per_person"],"title":"FlightBookingOption","description":"A single fare family option returned by the booking options endpoint."},"FlightBookingOptionsPrefetchRequest":{"properties":{"observation_id":{"type":"string","format":"uuid","title":"Observation Id"},"passengers":{"type":"integer","maximum":9.0,"minimum":1.0,"title":"Passengers","default":1},"adults":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Adults"},"children":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Children"},"infants_in_seat":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Infants In Seat"},"infants_on_lap":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Infants On Lap"},"trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}},"type":"object","required":["observation_id"],"title":"FlightBookingOptionsPrefetchRequest","description":"Request body for warming fare options before the fare step mounts."},"FlightBookingOptionsResponse":{"properties":{"passenger_mix":{"$ref":"#/components/schemas/PassengerCount","description":"Structured traveler mix used to price these fare options."},"options":{"items":{"$ref":"#/components/schemas/FlightBookingOption"},"type":"array","title":"Options"},"google_flights_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Flights Url","description":"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":{"type":"string","enum":["live","stored_fallback"],"title":"Price Source","description":"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).","default":"live"}},"type":"object","required":["options"],"title":"FlightBookingOptionsResponse","description":"Response for GET /flight-booking/options."},"FlightBookingPayRequest":{"properties":{"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id","description":"Stripe payment method ID (pm_xxx). If absent, returns client_secret for inline card entry."},"credit_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Amount Cents","description":"Axel credit to apply (cents). None/omitted=no credit, >0=apply this amount."},"payment_method_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Payment Method Types","description":"How the deferred Stripe Elements group was configured, e.g. ['card'] (inline pay only). The PaymentIntent is created to match — Stripe rejects confirm on mismatch. Omitted = automatic payment methods."}},"type":"object","title":"FlightBookingPayRequest","description":"Request body for POST /{session_id}/pay."},"FlightBookingPaymentResponse":{"properties":{"session_id":{"type":"string","format":"uuid","title":"Session Id"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"reference_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Code"},"operator_task_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Operator Task Id"},"payment_intent_id":{"type":"string","title":"Payment Intent Id"},"charged_amount_cents":{"type":"integer","title":"Charged Amount Cents"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","enum":["active","awaiting_payment","processing","completed","failed","abandoned","manual_recovery_required"],"title":"Status"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"credit_applied_cents":{"type":"integer","title":"Credit Applied Cents","default":0}},"type":"object","required":["session_id","payment_intent_id","charged_amount_cents","currency","status"],"title":"FlightBookingPaymentResponse","description":"Response from a successful flight booking payment.\n\nTwo modes:\n- Saved card: all fields populated, status=completed.\n- Inline pay: client_secret returned, booking_id/reference_code/operator_task_id\n  are None, status=awaiting_payment. Frontend confirms card, then calls confirm-payment."},"FlightBookingSessionCreate":{"properties":{"observation_id":{"type":"string","format":"uuid","title":"Observation Id","description":"Content DB observation ID for the selected flight"},"expected_observation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Expected Observation Id","description":"Content DB observation ID for the checkout flight the user saw. When provided, Travel rejects selected fare observations with a different itinerary."},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Optional conversational trip context"},"active_negotiation_offer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Active Negotiation Offer Id","description":"Optional active limited-time flight negotiation offer to apply to this checkout session."},"fare_family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Name","description":"Fare family display name (e.g. 'First Class', 'Main Cabin'). Stored for checkout display — supplier segments may lack this."},"fare_family_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Source","description":"Server-derived provenance for the checkout fare family. Public clients may not provide trusted provenance."},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id","description":"Server-derived canonical fare family ID for the checkout fare family. Public clients may not provide trusted IDs."},"fare_baggage":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fare Baggage","description":"Baggage allowance strings for checkout display (e.g. '1 carry-on bag')."},"fare_features":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fare Features","description":"Fare feature strings for checkout display (e.g. 'Seat selection included')."},"passenger_mix":{"anyOf":[{"$ref":"#/components/schemas/PassengerCount"},{"type":"null"}],"description":"Structured passenger mix used for fare lookup. Legacy callers may omit this."},"wake_token_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wake Token Hash","description":"SHA-256 hex hash of the wake token this checkout originated from. Write-through attribution only — never the raw token. Absence must not block checkout."},"src":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Src","description":"Short deeplink source slug the checkout originated from (e.g. 'wake_limited_time_flight_offer'). Write-through attribution only."},"origin_src":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Src","description":"Server-derived first-touch origin of the checkout's trip (the brain trip's origin_kind, e.g. 'google_flights_extension'). The gateway always overwrites this from the trip document — client-supplied values are discarded. Write-through attribution only; unlike src it survives return visits, overlay churn, and wake stomps because it is keyed to the trip, not the client's in-memory deeplink state."}},"type":"object","required":["observation_id"],"title":"FlightBookingSessionCreate","description":"Create a new flight-booking checkout session."},"FlightBookingSessionEntitlementReverifyResponse":{"properties":{"session":{"$ref":"#/components/schemas/FlightBookingSessionResponse"},"price_changed":{"type":"boolean","title":"Price Changed"},"previous_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Price Cents"},"new_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Price Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["session","price_changed"],"title":"FlightBookingSessionEntitlementReverifyResponse","description":"Response from re-verifying membership entitlement on a session (ENG-30052).\n\nRuns the charge path's own entitlement re-verification early so the\ncheckout display can follow a mid-checkout membership join; /pay re-runs\nthe same verify (a no-op once this has applied) and remains the\nenforcement point."},"FlightBookingSessionReconcileTravelersRequest":{"properties":{"traveler_profile_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Traveler Profile Ids"},"infant_travel_modes":{"additionalProperties":{"type":"string","enum":["lap","seat"]},"propertyNames":{"format":"uuid"},"type":"object","title":"Infant Travel Modes"}},"type":"object","title":"FlightBookingSessionReconcileTravelersRequest","description":"Request body for POST /{session_id}/reconcile-travelers."},"FlightBookingSessionReconcileTravelersResponse":{"properties":{"status":{"type":"string","enum":["session_unchanged","session_repriced","requires_infant_choice","fare_unavailable"],"title":"Status"},"session":{"$ref":"#/components/schemas/FlightBookingSessionResponse"},"previous_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Price Cents"},"new_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Price Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"required_infant_choices":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Required Infant Choices"},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason","description":"Machine-readable cause when status is fare_unavailable (e.g. 'no_matching_fare_option', 'party_mismatched_reprice'). Lets clients show party-aware recovery copy instead of blaming inventory for every reprice failure. None otherwise."}},"type":"object","required":["status","session"],"title":"FlightBookingSessionReconcileTravelersResponse","description":"Response from traveler reconciliation / repricing."},"FlightBookingSessionRefreshResponse":{"properties":{"session":{"$ref":"#/components/schemas/FlightBookingSessionResponse"},"price_changed":{"type":"boolean","title":"Price Changed"},"previous_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Price Cents"},"new_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Price Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["session","price_changed"],"title":"FlightBookingSessionRefreshResponse","description":"Response from refreshing a flight booking session."},"FlightBookingSessionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"observation_id":{"type":"string","format":"uuid","title":"Observation Id"},"checkout_step":{"type":"string","enum":["info","ancillaries","payment","processing","confirmed","failed"],"title":"Checkout Step"},"status":{"type":"string","enum":["active","awaiting_payment","processing","completed","failed","abandoned","manual_recovery_required"],"title":"Status"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"pricing_breakdown":{"anyOf":[{"$ref":"#/components/schemas/FlightPricingBreakdown"},{"type":"null"}],"description":"Typed flight price breakdown for checkout display."},"active_negotiation_offer":{"anyOf":[{"$ref":"#/components/schemas/FlightNegotiationOfferResponse"},{"type":"null"}],"description":"Active time-limited negotiation offer applied to this chat checkout."},"passenger_mix":{"$ref":"#/components/schemas/PassengerCount","description":"Structured traveler mix currently associated with the session pricing."},"fare_family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Name"},"fare_family_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Source"},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"operator_task_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Operator Task Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id"},"charged_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Charged Amount Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"discount_tier":{"type":"string","enum":["flight_only","bundle"],"title":"Discount Tier","description":"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.","default":"flight_only"},"traveler_names":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Traveler Names","description":"Resolved passenger names from traveler_profile_ids in payload"},"required_traveler_fields":{"items":{"$ref":"#/components/schemas/TravelerField"},"type":"array","title":"Required Traveler Fields","description":"Traveler profile fields the client must collect before payment."},"adult_gate_exempt":{"type":"boolean","title":"Adult Gate Exempt","description":"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.","default":false},"optional_traveler_fields":{"items":{"$ref":"#/components/schemas/TravelerField"},"type":"array","title":"Optional Traveler Fields","description":"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":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Purchase Intent Id","description":"Durable single-use purchase commitment this session belongs to (ENG-24229). None for sessions created before the intent rollout."},"purchase_intent_status":{"anyOf":[{"type":"string","enum":["open","committing","booked"]},{"type":"null"}],"title":"Purchase Intent Status","description":"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":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchase Intent Booking Id","description":"Booking that consumed the purchase intent. May belong to a sibling session of the same commitment."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","observation_id","checkout_step","status","payload","fare_family_name","booking_id","operator_task_id","expires_at","payment_method_id","stripe_customer_id","payment_intent_id","charged_amount_cents","currency","payment_status","failure_reason","idempotency_key","created_at","updated_at"],"title":"FlightBookingSessionResponse","description":"Persisted flight-booking checkout session."},"FlightBookingSessionUpdate":{"properties":{"checkout_step":{"anyOf":[{"type":"string","enum":["info","ancillaries","payment","processing","confirmed","failed"]},{"type":"null"}],"title":"Checkout Step"},"status":{"anyOf":[{"type":"string","enum":["active","awaiting_payment","processing","completed","failed","abandoned","manual_recovery_required"]},{"type":"null"}],"title":"Status"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"operator_task_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Operator Task Id"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id"},"charged_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Charged Amount Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"hotel_intent":{"anyOf":[{"type":"string","enum":["yes","no"]},{"type":"null"}],"title":"Hotel Intent","description":"FAC-942 staying declaration. 'yes' re-prices the session to the bundle tier (server-derived, unconditional, never re-raises) and guarantees a post-booking stays text; 'no' suppresses hotel-offer wakes for the trip. Price is never accepted from the client."}},"type":"object","title":"FlightBookingSessionUpdate","description":"Patch a persisted flight-booking checkout session."},"FlightCancelBookingResponse":{"properties":{"booking_id":{"type":"string","title":"Booking Id"},"booking_type":{"type":"string","const":"flight","title":"Booking Type"},"status":{"type":"string","title":"Status"},"payment_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Action"},"refund_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Id"},"cancellation_request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Request Id"},"request_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Status"},"supplier_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supplier Status"},"refund_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Status"},"auto_refund_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Refund Eligible"},"refund_review_requested":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Refund Review Requested"},"requested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested At"},"refund_amount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["booking_id","booking_type","status"],"title":"FlightCancelBookingResponse"},"FlightCancelInfoResponse":{"properties":{"booking_id":{"type":"string","title":"Booking Id"},"can_cancel":{"type":"boolean","title":"Can Cancel"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"auto_refund_eligible":{"type":"boolean","title":"Auto Refund Eligible","default":false},"dot_24h_eligible":{"type":"boolean","title":"Dot 24H Eligible","default":false},"dot_7_day_eligible":{"type":"boolean","title":"Dot 7 Day Eligible","default":false},"refund_deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refund Deadline At"},"booked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Booked At"},"first_departure_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Departure At"},"charged_amount":{"type":"integer","title":"Charged Amount","default":0},"charged_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charged Currency"},"refund_amount":{"type":"integer","title":"Refund Amount","default":0},"refund_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Currency"},"active_request":{"anyOf":[{"$ref":"#/components/schemas/FlightCancellationRequestInfo"},{"type":"null"}]}},"type":"object","required":["booking_id","can_cancel"],"title":"FlightCancelInfoResponse"},"FlightCancellationRequestInfo":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"refund_status":{"type":"string","title":"Refund Status"},"supplier_status":{"type":"string","title":"Supplier Status"},"auto_refund_eligible":{"type":"boolean","title":"Auto Refund Eligible"},"refund_review_requested":{"type":"boolean","title":"Refund Review Requested","default":false},"requested_at":{"type":"string","format":"date-time","title":"Requested At"}},"type":"object","required":["id","status","refund_status","supplier_status","auto_refund_eligible","requested_at"],"title":"FlightCancellationRequestInfo"},"FlightCreate":{"properties":{"marketing_carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Carrier","description":"Full airline name on the ticket, e.g., 'United Airlines', 'Delta Air Lines'"},"marketing_carrier_code":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Marketing Carrier Code","description":"IATA airline code for marketing carrier, e.g., 'UA', 'DL'"},"operating_carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Carrier","description":"Airline actually operating the flight, if different from marketing carrier (codeshare)"},"operating_carrier_code":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Operating Carrier Code","description":"IATA airline code for operating carrier, e.g., 'UA', 'DL'"},"flight_number":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Flight Number","description":"Flight number without airline code, e.g., '123', '1234'"},"cabin_class":{"anyOf":[{"$ref":"#/components/schemas/CabinClass"},{"type":"null"}],"description":"Cabin class for this segment"},"fare_family":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family","description":"Fare family / fare brand for this segment (e.g., 'Main Cabin', 'Basic Economy')."},"fare_family_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Fare Family Id","description":"Canonical fare family ID for this segment, e.g. 'ua_basic_economy'."},"fare_family_source":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Fare Family Source","description":"Provenance for the segment fare family."},"booking_class":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Booking Class","description":"Optional booking class / fare code if shown (e.g., 'Y', 'B', 'M', 'J')."},"origin":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Origin","description":"IATA airport code for departure, e.g., 'JFK', 'LAX'"},"destination":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Destination","description":"IATA airport code for arrival, e.g., 'JFK', 'LAX'"},"departure_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Departure Date","description":"Departure date (local to origin airport)"},"departure_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Departure Time","description":"Departure time (local to origin airport)"},"arrival_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Arrival Date","description":"Arrival date (local to destination airport)"},"arrival_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Arrival Time","description":"Arrival time (local to destination airport)"},"leg_index":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Leg Index","description":"Which leg this segment belongs to (0=outbound, 1=return, etc.). Segments with same leg_index are grouped together."}},"type":"object","title":"FlightCreate","description":"Schema for creating a flight segment.\n\nRepresents a single flight leg within a booking.\nAll fields are optional to support partial data."},"FlightDealShareCreateRequest":{"properties":{"kind":{"type":"string","const":"deal","title":"Kind"},"observation_id":{"type":"string","minLength":1,"title":"Observation Id"},"fare_name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Fare Name"},"passenger_count":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":1.0},{"type":"null"}],"title":"Passenger Count"}},"additionalProperties":false,"type":"object","required":["kind","observation_id"],"title":"FlightDealShareCreateRequest","description":"Mint a pre-book flight share from a trip-owned observation."},"FlightDiscountLineItem":{"properties":{"type":{"type":"string","enum":["axel_deal","member_deal","promo_code","axel_negotiation"],"title":"Type","description":"Discount source. Frontend can use this as a stable discriminator."},"label":{"type":"string","title":"Label","description":"Human-readable display label for the discount."},"amount":{"$ref":"#/components/schemas/Money","description":"Discount amount in payment currency."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Promo code when this line is a promo_code discount."},"percentage":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Percentage","description":"Configured promo percentage when this line is a percentage promo."},"basis":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Price this discount was applied against."},"offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Offer Id","description":"Limited-time offer id when this line comes from a time-limited Axel Deal."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Offer status when this line comes from a time-limited offer."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Expiration timestamp for time-limited discount lines."}},"type":"object","required":["type","label","amount"],"title":"FlightDiscountLineItem","description":"One discount applied to a flight price."},"FlightFormFields":{"properties":{"record_locator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Locator"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"origin_airport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Airport"},"destination_airport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Airport"},"departure_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Departure Date"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date"},"cash_paid":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid"},"cash_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cash Currency"}},"type":"object","title":"FlightFormFields","description":"Pre-computed form fields for the FE flight booking form.\n\nExtracted from the parsed blob so the FE doesn't need segment iteration logic."},"FlightGuideCurationRequest":{"properties":{"source_frame_id":{"type":"string","maxLength":200,"minLength":1,"title":"Source Frame Id"},"cursor":{"type":"integer","minimum":0.0,"title":"Cursor","default":0},"observation_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":5,"minItems":1},{"type":"null"}],"title":"Observation Ids"},"refinement":{"anyOf":[{"$ref":"#/components/schemas/FlightGuideRefinement"},{"type":"null"}]},"locale":{"type":"string","enum":["en","es"],"title":"Locale","default":"en"}},"type":"object","required":["source_frame_id"],"title":"FlightGuideCurationRequest","description":"Request one small, deterministic curation batch from a source frame.\n\nThe browser never supplies flight candidates.  ``source_frame_id`` is a\nserver-issued identifier for the canonical search cohort persisted on the\ntrip, so Brain can only judge entries that remain checkout-capable.\n``observation_ids`` optionally targets a small exact set from that cohort\nfor customer-opened cards; normal progressive curation uses ``cursor``."},"FlightGuideCurationResponse":{"properties":{"source_frame_id":{"type":"string","title":"Source Frame Id"},"status":{"type":"string","enum":["complete","retryable","terminal"],"title":"Status","default":"complete"},"next_cursor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Cursor"},"lead_ids":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Lead Ids"},"judgments":{"items":{"$ref":"#/components/schemas/FlightGuideJudgmentPatch"},"type":"array","title":"Judgments"}},"type":"object","required":["source_frame_id"],"title":"FlightGuideCurationResponse","description":"Stable page metadata plus judgment-only patches; never inventory.\n\n``retryable`` means this wave is not finished: some takes were dropped by\ngrounding even after Brain's own repair ask. Every accepted judgment is\nstill included, and ``next_cursor`` already points at the following wave,\nso a client may re-ask this cursor or move on. ``terminal`` means the model\ncall itself failed; inventory stays usable and the client decides whether\nto re-ask."},"FlightGuideInventoryResponse":{"properties":{"source_frame_id":{"type":"string","title":"Source Frame Id"},"cursor":{"type":"integer","minimum":0.0,"title":"Cursor"},"next_cursor":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Next Cursor"},"pending_outbounds":{"type":"integer","minimum":0.0,"title":"Pending Outbounds"},"failed_outbounds":{"type":"integer","minimum":0.0,"title":"Failed Outbounds","description":"Return pairings that exhausted automatic provider retries.","default":0},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results"}},"type":"object","required":["source_frame_id","cursor","pending_outbounds"],"title":"FlightGuideInventoryResponse","description":"Canonical production cards for one page of a persisted search frame."},"FlightGuideJudgmentPatch":{"properties":{"observation_id":{"type":"string","title":"Observation Id"},"verdict":{"type":"string","enum":["great","good","mixed","painful"],"title":"Verdict"},"take":{"type":"string","maxLength":180,"minLength":1,"title":"Take"},"traits":{"items":{"$ref":"#/components/schemas/FlightGuideTrait"},"type":"array","maxItems":3,"minItems":1,"title":"Traits"}},"type":"object","required":["observation_id","verdict","take","traits"],"title":"FlightGuideJudgmentPatch","description":"Grounded presentation overlay keyed to a checkout observation."},"FlightGuideMessageEntryContext":{"properties":{"kind":{"type":"string","const":"flight_guide_message","title":"Kind"},"source_frame_id":{"type":"string","maxLength":200,"minLength":1,"title":"Source Frame Id"},"refinement":{"$ref":"#/components/schemas/FlightGuideRefinement"}},"additionalProperties":false,"type":"object","required":["kind","source_frame_id"],"title":"FlightGuideMessageEntryContext","description":"Bind a visible message to the Flight Guide currently on screen.\n\nThe frame and refinement are server-issued/search-owned state. They let the\nbrain continue the mounted guide instead of falling back to the legacy\nflight-results renderer when the customer asks for a different fit."},"FlightGuideRefinement":{"properties":{"nonstop_only":{"type":"boolean","title":"Nonstop Only","default":false},"airline_only":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Airline Only"},"avoided_airlines":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Avoided Airlines"},"origin_airport_codes":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Origin Airport Codes"},"destination_airport_codes":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Destination Airport Codes"},"outbound_depart_after_minutes":{"anyOf":[{"type":"integer","maximum":1439.0,"minimum":0.0},{"type":"null"}],"title":"Outbound Depart After Minutes"},"outbound_depart_before_minutes":{"anyOf":[{"type":"integer","maximum":1439.0,"minimum":0.0},{"type":"null"}],"title":"Outbound Depart Before Minutes"},"return_depart_after_minutes":{"anyOf":[{"type":"integer","maximum":1439.0,"minimum":0.0},{"type":"null"}],"title":"Return Depart After Minutes"},"return_depart_before_minutes":{"anyOf":[{"type":"integer","maximum":1439.0,"minimum":0.0},{"type":"null"}],"title":"Return Depart Before Minutes"}},"type":"object","title":"FlightGuideRefinement","description":"Server-resolved filters for one canonical Flight Guide frame.\n\nThe browser supplies preferences, never candidate inventory.  Brain applies\nthese constraints to the persisted outbound frame and the complete cached\nPhase-2 return market, selecting at most one checkout observation per\noutbound."},"FlightGuideRefinementRequest":{"properties":{"cursor":{"type":"integer","minimum":0.0,"title":"Cursor","default":0},"refinement":{"$ref":"#/components/schemas/FlightGuideRefinement"},"retry_failed":{"type":"boolean","title":"Retry Failed","default":false}},"type":"object","title":"FlightGuideRefinementRequest"},"FlightGuideRefinementResponse":{"properties":{"source_frame_id":{"type":"string","title":"Source Frame Id"},"cursor":{"type":"integer","minimum":0.0,"title":"Cursor"},"next_cursor":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Next Cursor"},"pending_outbounds":{"type":"integer","minimum":0.0,"title":"Pending Outbounds"},"failed_outbounds":{"type":"integer","minimum":0.0,"title":"Failed Outbounds","description":"Return pairings that exhausted automatic provider retries.","default":0},"complete":{"type":"boolean","title":"Complete"},"refinement":{"$ref":"#/components/schemas/FlightGuideRefinement"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results"}},"type":"object","required":["source_frame_id","cursor","pending_outbounds","complete","refinement"],"title":"FlightGuideRefinementResponse","description":"One stable refinement page over complete checkout observations.\n\n``complete`` is true only on the final provider page after every outbound\nin that page has a conclusive cached Phase-2 result.  Callers must not claim\nzero matches or a +/- fare impact before it becomes true."},"FlightGuideTrait":{"properties":{"fact_id":{"type":"string","title":"Fact Id"},"sentiment":{"type":"string","enum":["positive","neutral","negative"],"title":"Sentiment"},"display_text":{"type":"string","maxLength":180,"minLength":1,"title":"Display Text"}},"type":"object","required":["fact_id","sentiment","display_text"],"title":"FlightGuideTrait"},"FlightNegotiationOfferResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"conv_trip_id":{"type":"string","format":"uuid","title":"Conv Trip Id"},"observation_id":{"type":"string","format":"uuid","title":"Observation Id"},"status":{"type":"string","enum":["active","expired","redeemed","cancelled","delivery_failed"],"title":"Status"},"percentage":{"type":"integer","title":"Percentage","default":10},"itinerary_fingerprint":{"type":"string","title":"Itinerary Fingerprint"},"cabin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin"},"departure_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Date"},"passenger_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passenger Count"},"total_savings_percentage":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Total Savings Percentage"},"google_flights_price":{"$ref":"#/components/schemas/Money"},"axel_deal_price":{"$ref":"#/components/schemas/Money"},"locked_price":{"$ref":"#/components/schemas/Money"},"axel_deal_discount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"limited_time_discount":{"$ref":"#/components/schemas/Money"},"free_percentage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Free Percentage"},"member_percentage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Percentage"},"member_deal_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_locked_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_limited_time_discount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"offered_at":{"type":"string","format":"date-time","title":"Offered At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"cooldown_until":{"type":"string","format":"date-time","title":"Cooldown Until"},"selected_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Selected Activity At"},"source_wake_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Wake Id"},"first_channel":{"anyOf":[{"type":"string","enum":["sms","email"]},{"type":"null"}],"title":"First Channel"},"final_channel":{"anyOf":[{"type":"string","enum":["sms","email"]},{"type":"null"}],"title":"Final Channel"},"sms_attempted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sms Attempted At"},"email_attempted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Attempted At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"redeemed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Redeemed At"},"metadata_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata Json"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","conv_trip_id","observation_id","status","itinerary_fingerprint","google_flights_price","axel_deal_price","locked_price","limited_time_discount","offered_at","expires_at","cooldown_until","created_at","updated_at"],"title":"FlightNegotiationOfferResponse","description":"A time-limited locked-price Axel Deal for one flight itinerary."},"FlightPairingsResponse":{"properties":{"status":{"type":"string","enum":["warming","ready"],"title":"Status"},"results":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Results"},"total_available":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Available"},"timing":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timing"},"market_checked_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Market Checked At"}},"type":"object","required":["status"],"title":"FlightPairingsResponse","description":"Display-composed round-trip return pairings envelope (FAC-895).\n\n``results`` items are field-compatible with the FE FlightResultOption\ncontract; kept as loose dicts so the pass-through card shape is preserved."},"FlightParseEvidence":{"properties":{"parse_status":{"$ref":"#/components/schemas/FareEvidenceStatus","default":"not_attempted"},"fare_evidence_status":{"anyOf":[{"$ref":"#/components/schemas/FareEvidenceStatus"},{"type":"null"}]},"parser_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parser Version"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"llm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model"},"llm_api_surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Api Surface"},"llm_reasoning_effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Reasoning Effort"},"llm_reasoning_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Reasoning Summary"},"llm_reasoning_summary_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Reasoning Summary Source"},"llm_latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Latency Ms"},"llm_input_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Input Tokens"},"llm_output_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Output Tokens"},"llm_claims":{"items":{"$ref":"#/components/schemas/LLMParseClaim"},"type":"array","title":"Llm Claims"},"parser_error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parser Error Message"},"verifier_decision":{"anyOf":[{"$ref":"#/components/schemas/VerifierDecision"},{"type":"null"}]},"verifier_reasons":{"items":{"type":"string"},"type":"array","title":"Verifier Reasons"},"llm_verifier_disagreement":{"type":"boolean","title":"Llm Verifier Disagreement","default":false},"human_review_required":{"type":"boolean","title":"Human Review Required","default":false},"fare_product":{"anyOf":[{"$ref":"#/components/schemas/FareProductEvidence"},{"type":"null"}]},"cabin":{"anyOf":[{"$ref":"#/components/schemas/CabinEvidence"},{"type":"null"}]},"booking_class":{"anyOf":[{"$ref":"#/components/schemas/BookingClassEvidence"},{"type":"null"}]},"price":{"anyOf":[{"$ref":"#/components/schemas/PriceEvidence"},{"type":"null"}]},"source_quality":{"anyOf":[{"$ref":"#/components/schemas/SourceQualityEvidence"},{"type":"null"}]},"raw_evidence_candidates":{"items":{"$ref":"#/components/schemas/RawFlightEvidenceCandidate"},"type":"array","title":"Raw Evidence Candidates"},"seat_extras":{"items":{"$ref":"#/components/schemas/SeatExtraEvidence"},"type":"array","title":"Seat Extras"},"possible_downgrade_reasons":{"items":{"type":"string"},"type":"array","title":"Possible Downgrade Reasons"},"segments":{"items":{"$ref":"#/components/schemas/SegmentFareEvidence"},"type":"array","title":"Segments"},"raw":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Raw"}},"additionalProperties":true,"type":"object","title":"FlightParseEvidence","description":"Durable parser evidence for the whole flight booking.\n\nThis supersedes the narrow fare_family_evidence shape while preserving\nenough flat compatibility fields for older callers during rollout."},"FlightPriceHistoryResponse":{"properties":{"route_slug":{"type":"string","title":"Route Slug"},"origin":{"$ref":"#/components/schemas/AdPlace"},"destination":{"$ref":"#/components/schemas/AdPlace"},"defaults":{"$ref":"#/components/schemas/FlightSearchDefaults"},"searched_at":{"type":"string","format":"date","title":"Searched At"},"price_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Level"},"typical_low_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typical Low Cents"},"typical_high_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typical High Cents"},"typical_swing_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typical Swing Cents"},"price_history":{"anyOf":[{"items":{"$ref":"#/components/schemas/PriceHistoryPoint"},"type":"array"},{"type":"null"}],"title":"Price History"}},"type":"object","required":["route_slug","origin","destination","defaults","searched_at"],"title":"FlightPriceHistoryResponse"},"FlightPriceWatchRequest":{"properties":{"current_total_cents":{"type":"integer","exclusiveMinimum":0.0,"title":"Current Total Cents"},"target_total_cents":{"type":"integer","exclusiveMinimum":0.0,"title":"Target Total Cents"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency"},"requested_action":{"type":"string","enum":["notify","auto_buy"],"title":"Requested Action"},"idempotency_key":{"type":"string","maxLength":128,"minLength":1,"title":"Idempotency Key"}},"type":"object","required":["current_total_cents","target_total_cents","currency","requested_action","idempotency_key"],"title":"FlightPriceWatchRequest"},"FlightPricingBreakdown":{"properties":{"supplier_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Comparison fare before Axel Deal and promo-code discounts: the booking-time price the customer saw (frozen original_price), falling back to supplier cost only on legacy rows. Never the post-settlement supplier invoice."},"price_after_axel_deal":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Customer price after Axel Deal and before promo-code discounts."},"final_customer_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Final customer price charged by Stripe."},"discounts":{"items":{"$ref":"#/components/schemas/FlightDiscountLineItem"},"type":"array","title":"Discounts","description":"Typed discount line items in the order they were applied."}},"type":"object","title":"FlightPricingBreakdown","description":"Typed price summary for an Axel-booked flight."},"FlightRepriceSegmentRequirement":{"properties":{"flight_number":{"type":"string","title":"Flight Number","description":"Customer-facing marketed flight number, e.g. 'UA790'."},"origin":{"type":"string","title":"Origin","description":"Segment origin airport code."},"destination":{"type":"string","title":"Destination","description":"Segment destination airport code."},"departure_date":{"type":"string","format":"date","title":"Departure Date","description":"Segment local departure date."},"departure_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Time","description":"Segment local departure time as HH:MM or HH:MM:SS when known."},"cabin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin","description":"Normalized booked segment cabin, when known."},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id","description":"Canonical booked segment fare-family ID, when known."},"marketing_carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Carrier","description":"Marketing carrier code from the original booking."},"marketing_flight_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Flight Number","description":"Marketing flight number from the original booking."},"operating_carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Carrier","description":"Operating carrier code from the original booking."},"operating_flight_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Flight Number","description":"Operating flight number from the original booking."}},"additionalProperties":false,"type":"object","required":["flight_number","origin","destination","departure_date"],"title":"FlightRepriceSegmentRequirement","description":"Original booked segment constraints for exact flight repricing."},"FlightReturnSelectionTarget":{"properties":{"type":{"type":"string","const":"flight_return_selection","title":"Type","default":"flight_return_selection"},"id":{"type":"string","minLength":1,"title":"Id"}},"type":"object","required":["id"],"title":"FlightReturnSelectionTarget"},"FlightReturnsRequest":{"properties":{"outbound_observation_id":{"type":"string","title":"Outbound Observation Id"}},"type":"object","required":["outbound_observation_id"],"title":"FlightReturnsRequest"},"FlightSavingsShareCreateRequest":{"properties":{"kind":{"type":"string","const":"savings","title":"Kind"},"booking_id":{"type":"string","minLength":1,"title":"Booking Id"},"booking_session_id":{"type":"string","format":"uuid","title":"Booking Session Id"}},"additionalProperties":false,"type":"object","required":["kind","booking_id","booking_session_id"],"title":"FlightSavingsShareCreateRequest","description":"Mint a post-book savings share from an owned Axel booking."},"FlightSavingsSharePrices":{"properties":{"public_price":{"$ref":"#/components/schemas/Money"},"axel_rate_price":{"$ref":"#/components/schemas/Money"},"customer_price":{"$ref":"#/components/schemas/Money"},"member_price":{"$ref":"#/components/schemas/Money"}},"type":"object","required":["public_price","axel_rate_price","customer_price","member_price"],"title":"FlightSavingsSharePrices"},"FlightScreenshotParseResponse":{"properties":{"booking_type":{"type":"string","const":"flight","title":"Booking Type","default":"flight"},"has_return_leg":{"type":"boolean","title":"Has Return Leg"},"parsed_fields":{"$ref":"#/components/schemas/FlightBookingData-Output"},"form_fields":{"$ref":"#/components/schemas/FlightFormFields"}},"type":"object","required":["has_return_leg","parsed_fields","form_fields"],"title":"FlightScreenshotParseResponse","description":"Response from flight screenshot parsing."},"FlightSearchDefaults":{"properties":{"departure_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Departure Date"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date"},"trip_length_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trip Length Days"},"passengers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passengers"},"cabin_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin Class"},"outbound_only_display":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Outbound Only Display"}},"type":"object","title":"FlightSearchDefaults"},"FlightSegment":{"properties":{"booking_id":{"type":"string","title":"Booking Id"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"flight_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flight Number"},"marketing_airline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Airline"},"marketing_airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Airline Code"},"operating_airline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Airline"},"operating_airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Airline Code"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination"},"departure_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Time"},"arrival_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrival Time"},"cabin_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin Class"},"status":{"type":"string","title":"Status"}},"type":"object","required":["booking_id","status"],"title":"FlightSegment","description":"Individual flight segment."},"FlightSegmentView":{"properties":{"leg_index":{"type":"integer","title":"Leg Index","description":"0=outbound, 1=return, etc."},"segment_index":{"type":"integer","title":"Segment Index","description":"Index within leg"},"flight_number":{"type":"string","title":"Flight Number","description":"Bare per-segment number, e.g. '2606'. Pairs with marketing_carrier_code ('DL') to compose display tokens like 'DL2606' at the UI boundary; never pre-joined here."},"marketing_carrier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Carrier Code"},"marketing_carrier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketing Carrier Name"},"operating_carrier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Carrier Code"},"operating_carrier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Carrier Name"},"origin":{"type":"string","title":"Origin","description":"IATA code, e.g., 'LAX'"},"origin_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin City","description":"City name, e.g., 'Los Angeles'"},"destination":{"type":"string","title":"Destination","description":"IATA code, e.g., 'SEA'"},"destination_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination City","description":"City name, e.g., 'Seattle'"},"departure_date":{"type":"string","format":"date","title":"Departure Date"},"departure_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Departure Time"},"arrival_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Arrival Time"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes","description":"Flight duration"},"layover_airport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layover Airport","description":"IATA code of layover airport"},"layover_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layover City","description":"City name of layover"},"layover_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Layover Minutes","description":"Minutes until next segment departs"}},"type":"object","required":["leg_index","segment_index","flight_number","origin","destination","departure_date"],"title":"FlightSegmentView","description":"Flight segment for display."},"FlightSetupStatus":{"properties":{"complete":{"type":"boolean","title":"Complete"},"traveler_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Traveler Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"}},"type":"object","required":["complete"],"title":"FlightSetupStatus"},"FlightShareCreateRequest":{"oneOf":[{"$ref":"#/components/schemas/FlightDealShareCreateRequest"},{"$ref":"#/components/schemas/FlightSavingsShareCreateRequest"}],"discriminator":{"propertyName":"kind","mapping":{"deal":"#/components/schemas/FlightDealShareCreateRequest","savings":"#/components/schemas/FlightSavingsShareCreateRequest"}}},"FlightShareCreateResponse":{"properties":{"url":{"type":"string","title":"Url"},"share":{"$ref":"#/components/schemas/FlightShareWakeLinkResolveResponse"}},"additionalProperties":false,"type":"object","required":["url","share"],"title":"FlightShareCreateResponse","description":"New public URL plus the exact immutable facts it will resolve to."},"FlightShareEvent":{"type":"string","enum":["native_invoked","native_resolved","native_cancelled","activation_retry","copied","failed"],"title":"FlightShareEvent","description":"Observable outcomes from the sender-side native share handoff."},"FlightShareLeg":{"properties":{"airline_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Name"},"airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Code"},"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"departure_date":{"type":"string","title":"Departure Date"},"departure_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Time"},"arrival_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrival Date"},"arrival_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrival Time"},"duration_minutes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Duration Minutes"},"stops":{"type":"integer","minimum":0.0,"title":"Stops"},"flight_numbers":{"items":{"type":"string"},"type":"array","title":"Flight Numbers"}},"additionalProperties":false,"type":"object","required":["origin","destination","departure_date","stops"],"title":"FlightShareLeg","description":"Public-safe itinerary facts for one ordered leg of a flight."},"FlightShareSnapshot":{"properties":{"fare_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Label"},"passenger_count":{"type":"integer","minimum":1.0,"title":"Passenger Count"},"legs":{"items":{"$ref":"#/components/schemas/FlightShareLeg"},"type":"array","maxItems":2,"minItems":1,"title":"Legs"},"axel_price_total":{"$ref":"#/components/schemas/Money"},"comparison_price_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["passenger_count","legs","axel_price_total"],"title":"FlightShareSnapshot","description":"Immutable, explicitly whitelisted facts safe for a public share page."},"FlightShareTarget":{"properties":{"type":{"type":"string","const":"flight_share","title":"Type","default":"flight_share"}},"additionalProperties":false,"type":"object","title":"FlightShareTarget","description":"Public target discriminator for a shared flight."},"FlightShareWakeLinkResolveResponse":{"properties":{"target":{"$ref":"#/components/schemas/FlightShareTarget"},"share_kind":{"type":"string","enum":["deal","savings"],"title":"Share Kind"},"snapshot":{"$ref":"#/components/schemas/FlightShareSnapshot"}},"additionalProperties":false,"type":"object","required":["target","share_kind","snapshot"],"title":"FlightShareWakeLinkResolveResponse","description":"Public response for a shared deal or post-book savings receipt."},"FlightSupportRequest":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"topic":{"$ref":"#/components/schemas/FlightSupportRequestTopic"},"message":{"type":"string","title":"Message"},"status":{"$ref":"#/components/schemas/FlightSupportRequestStatus"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"}},"type":"object","required":["id","topic","message","status","created_at","resolved_at","resolution_note"],"title":"FlightSupportRequest","description":"Customer-safe request projected onto a flight booking."},"FlightSupportRequestStatus":{"type":"string","enum":["open","resolved"],"title":"FlightSupportRequestStatus","description":"Customer-visible support-request states."},"FlightSupportRequestTopic":{"type":"string","enum":["date_time","passenger_name","ktn_rewards","bag","seat","other"],"title":"FlightSupportRequestTopic","description":"Customer-selected reason for requesting help with a flight booking."},"FlightWakeLinkCheckoutCard":{"properties":{"observation_id":{"type":"string","title":"Observation Id"},"conv_trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Id"},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carrier"},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"},"from_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From City"},"to_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To City"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"depart_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Depart Date"},"dep":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dep"},"arr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arr"},"stops":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stops"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"price":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Price"},"price_pp":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Price Pp"},"passengers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passengers"},"is_international":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is International"},"cabin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin"},"cabin_verification_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabin Verification Status"},"bookable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bookable"},"already_booked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Booked"},"booking_in_progress":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Booking In Progress"},"booked_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booked Booking Id"},"active_negotiation_offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Negotiation Offer Id"},"active_negotiation_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Negotiation Observation Id"},"active_negotiation_locked_total_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Negotiation Locked Total Cents"},"active_negotiation_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Negotiation Expires At"}},"additionalProperties":true,"type":"object","required":["observation_id"],"title":"FlightWakeLinkCheckoutCard","description":"Known flight checkout-card fields returned from a wake-link resolve."},"FlightWakeLinkResolveResponse":{"properties":{"trip_id":{"type":"string","title":"Trip Id"},"checkout_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Observation Id"},"fare_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Name"},"quoted_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quoted Price Cents"},"currency":{"type":"string","title":"Currency"},"src":{"type":"string","title":"Src"},"wake_token_hash":{"type":"string","title":"Wake Token Hash"},"minted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Minted At","description":"ISO-8601 UTC timestamp the wake link was minted (the wake_links row created_at). Additive; absent for links minted before this field."},"flight_negotiation_offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flight Negotiation Offer Id"},"checkout_card":{"anyOf":[{"$ref":"#/components/schemas/FlightWakeLinkCheckoutCard"},{"type":"null"}]},"target":{"anyOf":[{"$ref":"#/components/schemas/FlightReturnSelectionTarget"},{"type":"null"}]}},"type":"object","required":["trip_id","checkout_observation_id","fare_name","quoted_price_cents","currency","src","wake_token_hash"],"title":"FlightWakeLinkResolveResponse","description":"Resolve response for flight wake links."},"FocusHotelInSessionRequest":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"criteria_hash":{"type":"string","minLength":8,"title":"Criteria Hash"}},"type":"object","required":["hotel_id","criteria_hash"],"title":"FocusHotelInSessionRequest","description":"Attach a named hotel to the active map session for neutral inspection."},"FocusHotelInSessionResponse":{"properties":{"hotel_search_session_id":{"type":"string","format":"uuid","title":"Hotel Search Session Id"},"criteria_hash":{"type":"string","minLength":8,"title":"Criteria Hash"},"pin":{"$ref":"#/components/schemas/HotelMapPin"},"update_mode":{"type":"string","const":"price_patch","title":"Update Mode"}},"type":"object","required":["hotel_search_session_id","criteria_hash","pin","update_mode"],"title":"FocusHotelInSessionResponse"},"ForwardingAddressResponse":{"properties":{"address":{"type":"string","title":"Address"},"instructions":{"type":"string","title":"Instructions"}},"type":"object","required":["address","instructions"],"title":"ForwardingAddressResponse","description":"User-facing forwarding address (shared canonical inbox)."},"Gender":{"type":"string","enum":["M","F"],"title":"Gender","description":"Gender for airline ticketing."},"GmailAccountsListResponse":{"properties":{"accounts":{"items":{"$ref":"#/components/schemas/LinkedGmailAccount"},"type":"array","title":"Accounts"}},"type":"object","required":["accounts"],"title":"GmailAccountsListResponse","description":"Response schema for listing linked Gmail accounts."},"GmailImportStartResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"auth_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Url"},"credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Id"},"failure_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Redirect Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["success"],"title":"GmailImportStartResponse","description":"Response schema for Gmail import start endpoint.\n\nReturns the auth URL for the gateway to redirect the user to Google OAuth,\nor a failure redirect URL if something went wrong."},"GuestInput":{"properties":{"traveler_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Traveler Profile Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","description":"Guest's first/given name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name","description":"Guest's middle name, if present"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name","description":"Guest's last/family name"},"is_primary_guest":{"type":"boolean","title":"Is Primary Guest","description":"True if this is the primary guest (person who made the booking)","default":false}},"type":"object","title":"GuestInput","description":"Flexible guest input schema.\n\nCan specify either:\n- An existing traveler_profile_id to link to\n- Name details to match/create a TravelerProfile"},"GuestRoom-Output":{"properties":{"adults":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Adults","description":"Number of adults"},"children":{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array","title":"Children","description":"List of children with ages","examples":[[{"age":5},{"age":8}]]}},"type":"object","required":["adults"],"title":"GuestRoom","description":"Guest configuration for a single room.","example":{"adults":2,"children":[{"age":5}]}},"GuestUpdateRequest":{"properties":{"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth","description":"Guest date of birth (ISO 8601 date)"},"citizenship":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Citizenship","description":"Guest citizenship (ISO 3166-1 alpha-2 country code)"},"is_primary":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Primary","description":"Whether this guest is the primary traveler"}},"type":"object","title":"GuestUpdateRequest","description":"Request body for updating a guest on a hotel booking."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HoldFlightRequest":{"properties":{"observation_id":{"type":"string","title":"Observation Id"},"displayed_total_cents":{"type":"integer","title":"Displayed Total Cents"},"currency":{"type":"string","title":"Currency"},"pax_count":{"type":"integer","title":"Pax Count"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id"},"held_items":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Held Items"}},"type":"object","required":["observation_id","displayed_total_cents","currency","pax_count"],"title":"HoldFlightRequest","description":"Arm a 24h fare hold on the trip's pinned flight (FAC-940).\n\nBasket lock (ENG-21867 follow-on): ``held_items`` are the bag/seat lines\nlocked with the fare. The gateway forwards them verbatim — the brain owns\nevery semantic validator (identity, amounts, all-or-nothing), so this\nmodel stays deliberately permissive: a stricter mirror here would just be\na second copy that drifts. Without this field the default extra=ignore\nsilently stripped the lines and every hold armed fare-only."},"HotelAdCuration":{"properties":{"take":{"type":"string","title":"Take","default":""},"context":{"type":"string","title":"Context","default":""}},"type":"object","title":"HotelAdCuration"},"HotelAdDealResponse":{"properties":{"deal_type":{"type":"string","const":"hotel","title":"Deal Type","default":"hotel"},"destination_slug":{"type":"string","title":"Destination Slug"},"destination":{"$ref":"#/components/schemas/AdHotelDestination"},"defaults":{"$ref":"#/components/schemas/HotelSearchDefaults"},"searched_at":{"type":"string","format":"date","title":"Searched At"},"hotels_checked":{"type":"integer","title":"Hotels Checked"},"hotels_priced":{"type":"integer","title":"Hotels Priced","default":0},"pricing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Status"},"intro_message":{"type":"string","title":"Intro Message","default":"Hey, I’m Axel. I’m your AI travel agent and I want to save you money (for free).\n\nI find hidden flight and hotel deals, then keep working to save you money even after you book.\n\nLoading live options for you now. Want to change dates, budget, or anything else? Message me and let's get this trip booked."},"curation":{"$ref":"#/components/schemas/HotelAdCuration"},"hotels":{"items":{"$ref":"#/components/schemas/AdHotel"},"type":"array","title":"Hotels"}},"type":"object","required":["destination_slug","destination","defaults","searched_at","hotels_checked","curation","hotels"],"title":"HotelAdDealResponse"},"HotelAdHandoffRequest":{"properties":{"engagement_type":{"type":"string","enum":["chat","deal"],"title":"Engagement Type"},"ad_context":{"$ref":"#/components/schemas/HotelAdDealResponse"},"user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message"},"selected_hotel":{"anyOf":[{"$ref":"#/components/schemas/SelectedAdHotel"},{"type":"null"}]}},"type":"object","required":["engagement_type","ad_context"],"title":"HotelAdHandoffRequest"},"HotelBookingData-Input":{"properties":{"hotel_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Hotel Name","description":"Full hotel property name, e.g., 'The Ritz-Carlton San Francisco', 'Hampton Inn LAX'"},"hotel_chain":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Hotel Chain","description":"Hotel chain or brand, e.g., 'Marriott', 'Hilton', 'IHG', 'Hyatt'"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address","description":"Street address where the hotel is located, e.g., '600 Stockton Street'"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City","description":"City where the hotel is located, e.g., 'San Francisco', 'New York'"},"state":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"State","description":"State or province where the hotel is located, e.g., 'California', 'CA', 'Ontario'"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country","description":"ISO 3166-1 alpha-2 country code where the hotel is located, e.g., 'US', 'GB', 'JP'"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code","description":"Postal or ZIP code where the hotel is located, e.g., '94108', 'SW1A 1AA'"},"check_in_date":{"anyOf":[{"type":"string","format":"date"},{"type":"string"},{"type":"null"}],"title":"Check In Date","description":"Check-in date in ISO 8601 format (YYYY-MM-DD), e.g., '2024-03-15'"},"check_out_date":{"anyOf":[{"type":"string","format":"date"},{"type":"string"},{"type":"null"}],"title":"Check Out Date","description":"Check-out date in ISO 8601 format (YYYY-MM-DD), e.g., '2024-03-18'"},"room_type":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Room Type","description":"Room category or type, e.g., 'Deluxe King', 'Standard Double', 'Junior Suite'"},"number_of_rooms":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Number Of Rooms","description":"Number of rooms booked, defaults to 1 if not specified"},"cash_paid":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid","description":"Cash amount paid. For award bookings, this may be $0 or just resort fees. For mixed bookings (points + cash), this is the cash portion."},"cash_per_night":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Per Night","description":"Cash per night. For award bookings, this may be $0."},"cash_currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Cash Currency","description":"ISO 4217 currency code for cash amounts, e.g., 'USD', 'EUR'"},"special_requests":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Special Requests","description":"Guest special requests, comma-separated, e.g., 'late check-out, high floor, quiet room'"},"cancellation_policy":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Cancellation Policy","description":"Full cancellation policy text as shown in the email"},"free_cancellation_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Free Cancellation Until","description":"Deadline for free cancellation in ISO 8601 format with timezone, e.g., '2024-03-14T18:00:00-05:00'"},"booked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Booked At","description":"Date/time when the booking was made, in ISO 8601 format, e.g., '2024-02-01T10:30:00Z'"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Cancelled At","description":"Date/time when the booking was cancelled, if applicable, in ISO 8601 format"},"hotels":{"anyOf":[{"items":{"$ref":"#/components/schemas/HotelCreate"},"type":"array"},{"type":"null"}],"title":"Hotels","description":"Hotel entries (currently unused stub)"},"guests":{"anyOf":[{"items":{"$ref":"#/components/schemas/GuestInput"},"type":"array"},{"type":"null"}],"title":"Guests","description":"List of guests for this booking with name details"},"refundable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Refundable","description":"Whether the booking is refundable. true if cancellation with full or partial refund is available, false if explicitly non-refundable, null if unknown."},"confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Number","description":"Hotel confirmation code or reservation number, e.g., '12345678', 'CONF-ABC123'"},"booking_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Provider","description":"Where booking was made: 'direct' (hotel site), or OTA name like 'Expedia', 'Booking.com', 'Hotels.com'"},"is_award_booking":{"type":"boolean","title":"Is Award Booking","description":"True if this is a points redemption booking","default":false},"loyalty_program":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Loyalty Program","description":"Loyalty program name, e.g., 'Marriott Bonvoy', 'Hilton Honors'"},"loyalty_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Loyalty Number","description":"Loyalty program account number"},"points_paid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Points Paid","description":"Points paid for award booking"}},"type":"object","title":"HotelBookingData","description":"Actual data fields for hotel bookings -- separated out from api create schema so this can be used as a structured output\nresponse format for the LLM."},"HotelBookingData-Output":{"properties":{"hotel_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Hotel Name","description":"Full hotel property name, e.g., 'The Ritz-Carlton San Francisco', 'Hampton Inn LAX'"},"hotel_chain":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Hotel Chain","description":"Hotel chain or brand, e.g., 'Marriott', 'Hilton', 'IHG', 'Hyatt'"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address","description":"Street address where the hotel is located, e.g., '600 Stockton Street'"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City","description":"City where the hotel is located, e.g., 'San Francisco', 'New York'"},"state":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"State","description":"State or province where the hotel is located, e.g., 'California', 'CA', 'Ontario'"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country","description":"ISO 3166-1 alpha-2 country code where the hotel is located, e.g., 'US', 'GB', 'JP'"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code","description":"Postal or ZIP code where the hotel is located, e.g., '94108', 'SW1A 1AA'"},"check_in_date":{"anyOf":[{"type":"string","format":"date"},{"type":"string"},{"type":"null"}],"title":"Check In Date","description":"Check-in date in ISO 8601 format (YYYY-MM-DD), e.g., '2024-03-15'"},"check_out_date":{"anyOf":[{"type":"string","format":"date"},{"type":"string"},{"type":"null"}],"title":"Check Out Date","description":"Check-out date in ISO 8601 format (YYYY-MM-DD), e.g., '2024-03-18'"},"room_type":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Room Type","description":"Room category or type, e.g., 'Deluxe King', 'Standard Double', 'Junior Suite'"},"number_of_rooms":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Number Of Rooms","description":"Number of rooms booked, defaults to 1 if not specified"},"cash_paid":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid","description":"Cash amount paid. For award bookings, this may be $0 or just resort fees. For mixed bookings (points + cash), this is the cash portion."},"cash_per_night":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Per Night","description":"Cash per night. For award bookings, this may be $0."},"cash_currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Cash Currency","description":"ISO 4217 currency code for cash amounts, e.g., 'USD', 'EUR'"},"special_requests":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Special Requests","description":"Guest special requests, comma-separated, e.g., 'late check-out, high floor, quiet room'"},"cancellation_policy":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Cancellation Policy","description":"Full cancellation policy text as shown in the email"},"free_cancellation_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Free Cancellation Until","description":"Deadline for free cancellation in ISO 8601 format with timezone, e.g., '2024-03-14T18:00:00-05:00'"},"booked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Booked At","description":"Date/time when the booking was made, in ISO 8601 format, e.g., '2024-02-01T10:30:00Z'"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Cancelled At","description":"Date/time when the booking was cancelled, if applicable, in ISO 8601 format"},"hotels":{"anyOf":[{"items":{"$ref":"#/components/schemas/HotelCreate"},"type":"array"},{"type":"null"}],"title":"Hotels","description":"Hotel entries (currently unused stub)"},"guests":{"anyOf":[{"items":{"$ref":"#/components/schemas/GuestInput"},"type":"array"},{"type":"null"}],"title":"Guests","description":"List of guests for this booking with name details"},"refundable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Refundable","description":"Whether the booking is refundable. true if cancellation with full or partial refund is available, false if explicitly non-refundable, null if unknown."},"confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Number","description":"Hotel confirmation code or reservation number, e.g., '12345678', 'CONF-ABC123'"},"booking_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Provider","description":"Where booking was made: 'direct' (hotel site), or OTA name like 'Expedia', 'Booking.com', 'Hotels.com'"},"is_award_booking":{"type":"boolean","title":"Is Award Booking","description":"True if this is a points redemption booking","default":false},"loyalty_program":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Loyalty Program","description":"Loyalty program name, e.g., 'Marriott Bonvoy', 'Hilton Honors'"},"loyalty_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Loyalty Number","description":"Loyalty program account number"},"points_paid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Points Paid","description":"Points paid for award booking"}},"type":"object","title":"HotelBookingData","description":"Actual data fields for hotel bookings -- separated out from api create schema so this can be used as a structured output\nresponse format for the LLM."},"HotelBookingDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"status":{"type":"string","title":"Status"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_axel_booked":{"type":"boolean","title":"Is Axel Booked","description":"True if booked through Axel (booking_channel='axel')","default":false},"booking_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Provider"},"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name"},"hotel_chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Chain"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"check_in_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In Date"},"check_out_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out Date"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"is_refundable":{"$ref":"#/components/schemas/RefundableStatus","default":"unknown"},"free_cancellation_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Cancellation Until"},"axel_can_cancel":{"$ref":"#/components/schemas/CancelCapability","default":"unknown"},"guests":{"items":{"type":"string"},"type":"array","title":"Guests","description":"Guest names"},"total_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"is_award_booking":{"type":"boolean","title":"Is Award Booking","default":false},"reprice_capability":{"anyOf":[{"$ref":"#/components/schemas/RepriceCapability"},{"type":"null"}]},"credit_secured":{"anyOf":[{"$ref":"#/components/schemas/SavingsSecured"},{"type":"null"}]}},"type":"object","required":["id","user_id","status","confirmation_code","created_at","updated_at"],"title":"HotelBookingDetailResponse","description":"Enriched hotel booking detail for client."},"HotelCancelInfoResponse":{"properties":{"booking_id":{"type":"string","title":"Booking Id"},"can_cancel":{"type":"boolean","title":"Can Cancel"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"current_penalty_percent":{"type":"integer","title":"Current Penalty Percent"},"free_cancellation_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Cancellation Until"},"charged_amount":{"type":"integer","title":"Charged Amount","default":0},"charged_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charged Currency"},"refund_amount":{"type":"integer","title":"Refund Amount","default":0},"refund_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Currency"},"is_within_free_cancel":{"type":"boolean","title":"Is Within Free Cancel","default":false}},"type":"object","required":["booking_id","can_cancel","current_penalty_percent"],"title":"HotelCancelInfoResponse"},"HotelCluster":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id"},"cluster_type":{"$ref":"#/components/schemas/ClusterType","default":"grouped"},"center":{"$ref":"#/components/schemas/LatLng"},"bounds":{"$ref":"#/components/schemas/ClusterBounds"},"hotel_count":{"type":"integer","title":"Hotel Count"},"price_range":{"anyOf":[{"$ref":"#/components/schemas/PriceRange"},{"type":"null"}]},"avg_star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Star Rating"}},"type":"object","required":["cluster_id","center","bounds","hotel_count"],"title":"HotelCluster","description":"Group of nearby hotels collapsed into a single pin at low zoom levels.\n\nShown when hotel density is too high for individual pins. Clicking a\ncluster zooms into its bounds, triggering a new query at higher zoom\nwhere the cluster dissolves into individual HotelSearchResults."},"HotelCreate":{"properties":{},"type":"object","title":"HotelCreate","description":"Schema for creating a hotel entry.\n\nThis is a stub model that will be expanded with hotel-specific details later.\nCurrently minimal fields."},"HotelCurateResponse":{"properties":{"take":{"type":"string","title":"Take"},"notes_location":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Notes Location"},"hotels":{"items":{"$ref":"#/components/schemas/HotelCurationResult"},"type":"array","title":"Hotels"},"picks":{"items":{"$ref":"#/components/schemas/HotelCurationPick"},"type":"array","title":"Picks"},"map_annotations":{"items":{"$ref":"#/components/schemas/HotelMapAnnotation"},"type":"array","title":"Map Annotations"},"pick_hotel_ids":{"items":{"type":"integer"},"type":"array","title":"Pick Hotel Ids"},"new_pick_hotel_ids":{"items":{"type":"integer"},"type":"array","title":"New Pick Hotel Ids"},"curation_status":{"type":"string","enum":["applied","waiting_for_inventory","preserved"],"title":"Curation Status","default":"applied"}},"type":"object","required":["take","hotels"],"title":"HotelCurateResponse"},"HotelCurationDetailRequest":{"properties":{"hotel_search_session_id":{"type":"string","format":"uuid","title":"Hotel Search Session Id"},"hotel_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Hotel Id"}},"type":"object","required":["hotel_search_session_id","hotel_id"],"title":"HotelCurationDetailRequest"},"HotelCurationDetailResponse":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"disposition":{"type":"string","enum":["pick","alternative","pass","insufficient_facts"],"title":"Disposition"},"fit":{"type":"string","enum":["great","good","fine","not_fit"],"title":"Fit"},"verdict":{"type":"string","title":"Verdict"},"why_not_pick":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Not Pick"},"reasons":{"items":{"$ref":"#/components/schemas/HotelCurationReason"},"type":"array","title":"Reasons"}},"type":"object","required":["hotel_id","disposition","fit","verdict","why_not_pick","reasons"],"title":"HotelCurationDetailResponse"},"HotelCurationPick":{"properties":{"hotel_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Hotel Id"},"fit":{"type":"string","enum":["great","good","fine"],"title":"Fit"},"map_tag":{"anyOf":[{"type":"string","maxLength":40,"minLength":3},{"type":"null"}],"title":"Map Tag"},"verdict":{"type":"string","maxLength":320,"minLength":8,"title":"Verdict"},"reasons":{"items":{"$ref":"#/components/schemas/HotelCurationReason"},"type":"array","maxItems":3,"title":"Reasons"}},"type":"object","required":["hotel_id","fit","verdict"],"title":"HotelCurationPick","description":"Complete customer-facing judgment for one Axel pick."},"HotelCurationReason":{"properties":{"stance":{"type":"string","enum":["for","tradeoff","against"],"title":"Stance"},"text":{"type":"string","maxLength":180,"minLength":4,"title":"Text"}},"type":"object","required":["stance","text"],"title":"HotelCurationReason","description":"One concise reason supporting Axel's hotel judgment."},"HotelCurationResult":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"highlight":{"type":"string","title":"Highlight","default":""},"comment":{"type":"string","title":"Comment","default":""},"is_pick":{"type":"boolean","title":"Is Pick","default":true},"is_featured":{"type":"boolean","title":"Is Featured","default":true}},"type":"object","required":["hotel_id"],"title":"HotelCurationResult","description":"Legacy pick shape retained while clients adopt structured picks."},"HotelDetailQuestionEntryContext":{"properties":{"kind":{"type":"string","const":"hotel_detail_question","title":"Kind"},"hotel_search_session_id":{"type":"string","format":"uuid","title":"Hotel Search Session Id"},"map_session_id":{"type":"string","minLength":1,"title":"Map Session Id"},"criteria_hash":{"type":"string","minLength":8,"title":"Criteria Hash"},"hotel_id":{"type":"integer","title":"Hotel Id"},"selected_room_group_id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Selected Room Group Id"},"visible_section":{"anyOf":[{"type":"string","enum":["rooms","amenities","about","location","policies"]},{"type":"null"}],"title":"Visible Section"}},"additionalProperties":false,"type":"object","required":["kind","hotel_search_session_id","map_session_id","criteria_hash","hotel_id"],"title":"HotelDetailQuestionEntryContext","description":"Typed state attached to a visible turn sent from the hotel detail page.\n\nThe detail page is the hotel the customer opened from the map, so it carries\nthe same server-bound map/search identity plus the one hotel on screen. Only\nthe hotel identity and what is on screen travel here: the hotel's own facts\n(amenities, location, description, policies, rates) are hydrated server-side\nfrom Content, never supplied by the client."},"HotelFormFields":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name"},"confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Number"},"check_in_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In Date"},"check_out_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out Date"},"cash_paid":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid"},"cash_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cash Currency"}},"type":"object","title":"HotelFormFields","description":"Pre-computed form fields for the FE hotel booking form."},"HotelImage":{"properties":{"url":{"type":"string","title":"Url"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","required":["url"],"title":"HotelImage","description":"A hotel image with optional category metadata.\n\nURLs may contain a ``{size}`` placeholder (e.g.\n``https://cdn.worldota.net/t/{size}/content/...``). Consumers should\nreplace it with the desired resolution: ``240x240``, ``640x400``,\n``1024x768``, or ``orig``."},"HotelMapAnnotation":{"properties":{"hotel_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Hotel Id"},"map_tag":{"type":"string","maxLength":40,"minLength":3,"title":"Map Tag"},"kind":{"type":"string","enum":["draw","caveat"],"title":"Kind"}},"type":"object","required":["hotel_id","map_tag","kind"],"title":"HotelMapAnnotation","description":"A sparse tag for a non-pick hotel that merits attention."},"HotelMapPin":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"name":{"type":"string","title":"Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"review_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Rating"},"review_rating_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Rating Source"},"hotel_chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Chain"},"address":{"type":"string","title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"price":{"anyOf":[{"$ref":"#/components/schemas/HotelPrice"},{"type":"null"}]},"compare_price":{"anyOf":[{"$ref":"#/components/schemas/ComparePrice"},{"type":"null"}]},"price_proof":{"anyOf":[{"$ref":"#/components/schemas/HotelPriceProof"},{"type":"null"}]},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"cluster_below_zoom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cluster Below Zoom"},"debug":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Debug"},"pin_kind":{"$ref":"#/components/schemas/HotelMapPinKind"},"is_pick":{"type":"boolean","title":"Is Pick","default":false}},"type":"object","required":["hotel_id","name","latitude","longitude","address","pin_kind"],"title":"HotelMapPin","description":"Map-first pin: the existing hotel summary result plus map pin state."},"HotelMapPinKind":{"type":"string","enum":["known_unpriced","live_price","unavailable","pricing_failed"],"title":"HotelMapPinKind","description":"Explicit pin rendering states for map-first hotel search.\n\nThere is deliberately no cached/estimated price state. Product wants\nunpriced pins to render location-only until a real live price lands."},"HotelMapRefinementEntryContext":{"properties":{"kind":{"type":"string","const":"hotel_map_refinement","title":"Kind"},"action":{"type":"string","enum":["ask_axel","recommend_area","edit_criteria"],"title":"Action"},"hotel_search_session_id":{"type":"string","format":"uuid","title":"Hotel Search Session Id"},"map_session_id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Map Session Id"},"criteria_hash":{"anyOf":[{"type":"string","minLength":8},{"type":"null"}],"title":"Criteria Hash"},"area_label":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Area Label"},"viewport":{"anyOf":[{"$ref":"#/components/schemas/Viewport"},{"type":"null"}]},"selected_hotel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Hotel Id"},"criteria":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchCriteria"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["kind","action","hotel_search_session_id"],"title":"HotelMapRefinementEntryContext","description":"Typed state attached to a visible turn sent from the hotel map.\n\nThe IDs bind the turn to the exact map/search instance the customer saw.\n``recommend_area`` is the only action that changes recommendation geography;\nan ordinary ``ask_axel`` turn can refine picks without treating the current\ncamera position as intent.\n\n``edit_criteria`` carries a complete, already-validated search draft from\nthe map's own search editor — destination, dates and party. It is not a\nvisible chat message and carries no customer prose: the customer filled in\na form and pressed Search, so there is nothing for the model to interpret.\nDates and guests are immutable on a Content search session (see\n``HotelSearchCriteria``), so applying one mints a replacement session\nrather than mutating the current one.\n\n``map_session_id`` and ``criteria_hash`` are the mounted map's identity and\nstay required for every map-local action. They are optional only for\n``edit_criteria``, which the checkout surface also sends — the same stay\nand party editor sits above the room list there, with no map mounted and\nso no map identity to quote. When they are supplied they are still\nchecked, so a map-originated edit keeps its staleness guarantee."},"HotelMembershipExample":{"properties":{"name":{"type":"string","title":"Name"},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"destination":{"type":"string","title":"Destination"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"nights":{"type":"integer","title":"Nights"},"adults":{"type":"integer","title":"Adults"},"room_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Name"},"public_provider":{"type":"string","title":"Public Provider"},"public_total":{"$ref":"#/components/schemas/Money"},"axel_floor_total":{"$ref":"#/components/schemas/Money"},"ordinary_axel_total":{"$ref":"#/components/schemas/Money"},"free_total":{"$ref":"#/components/schemas/Money"},"member_total":{"$ref":"#/components/schemas/Money"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["name","destination","check_in","check_out","nights","adults","public_provider","public_total","axel_floor_total","ordinary_axel_total","free_total","member_total","expires_at"],"title":"HotelMembershipExample","description":"One room, whole-stay USD example, never a booking or payment quote.\n\nPublic evidence matches property, dates and occupancy, not necessarily the\nroom, meal or cancellation terms. R is the established member all-in rate;\nthe computed 50/75 prices do not change hotel checkout policy."},"HotelMembershipPreviewRequest":{"properties":{"observation_id":{"type":"string","format":"uuid","title":"Observation Id"}},"type":"object","required":["observation_id"],"title":"HotelMembershipPreviewRequest"},"HotelNegotiationMapPayload":{"properties":{"component":{"type":"string","const":"hotel_map","title":"Component","default":"hotel_map"},"map_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Map Session Id"},"update_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Update Mode"},"hotel_search_session_id":{"anyOf":[{"type":"string"},{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hotel Search Session Id"},"criteria_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Criteria Hash"},"anchor":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchAnchor"},{"type":"null"}]},"loaded_bounds":{"anyOf":[{"$ref":"#/components/schemas/Viewport"},{"type":"null"}]},"pins":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Pins"},"map_pins":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Map Pins"},"clusters":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Clusters"},"pricing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Status"},"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"guests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Guests"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"guest_rooms":{"items":{"$ref":"#/components/schemas/GuestRoom-Output"},"type":"array","title":"Guest Rooms"},"focused_hotel_id":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Focused Hotel Id"},"conv_trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Id"},"hotel_negotiation_offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Negotiation Offer Id"},"quote_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote Id"},"rate_identity_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Identity Json"}},"additionalProperties":true,"type":"object","title":"HotelNegotiationMapPayload","description":"Known fields in the hotel_map payload attached to hotel negotiations."},"HotelNegotiationMessageFacts":{"properties":{"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name"},"room_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Name"},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"star_rating_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Star Rating Display"},"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"is_refundable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Refundable"},"locked_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"locked_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"compare_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"compare_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"compare_price_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compare Price Provider"},"compare_price_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compare Price Source"},"compare_price_source_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compare Price Source Display"},"savings_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"savings_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Savings Percent","description":"Fraction saved vs the comparison price, e.g. 0.22 = 22%."},"savings_percent_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Savings Percent Display"},"free_cancellation_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free Cancellation Until"},"customer_pay_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Pay By"}},"additionalProperties":true,"type":"object","title":"HotelNegotiationMessageFacts","description":"Customer-safe facts used to render hotel negotiation offer copy."},"HotelPrice":{"properties":{"nightly_rate":{"$ref":"#/components/schemas/Money"},"total":{"$ref":"#/components/schemas/Money"},"member_nightly_rate":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"is_approximate":{"type":"boolean","title":"Is Approximate"},"cached_at":{"type":"string","format":"date-time","title":"Cached At"},"room_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"is_refundable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Refundable"},"free_cancellation_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Cancellation Until"},"meal_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meal Plan"},"bed_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bed Type"},"mandatory_fees":{"items":{"$ref":"#/components/schemas/MandatoryFee"},"type":"array","title":"Mandatory Fees"},"retail_comparison_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"retail_comparison_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"exact_public_rate_comparison":{"anyOf":[{"$ref":"#/components/schemas/ExactPublicRateComparison"},{"type":"null"}]},"all_in_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"all_in_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_all_in_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_all_in_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["nightly_rate","total","is_approximate","cached_at"],"title":"HotelPrice","description":"Best known price for a hotel. Starts approximate (from cache), then\ngets replaced with live data from the provider once pricing resolves.\n\nPhase 1 (cached): is_approximate=True, only nightly_rate + total populated.\nPhase 2 (live):   is_approximate=False, all fields populated from provider.\n\nClient rendering: always read price.nightly_rate. If is_approximate, show\nwith \"~\" prefix. No field branching needed."},"HotelPriceBreakdown":{"properties":{"nights":{"type":"integer","title":"Nights"},"nightly_rate_cents":{"type":"integer","title":"Nightly Rate Cents"},"nightly_rate_currency":{"type":"string","title":"Nightly Rate Currency"},"subtotal_cents":{"type":"integer","title":"Subtotal Cents"},"fees_at_property_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fees At Property Cents"},"fees_at_property_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fees At Property Currency"},"total_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Cents"},"total_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Currency"}},"type":"object","required":["nights","nightly_rate_cents","nightly_rate_currency","subtotal_cents"],"title":"HotelPriceBreakdown","description":"Computed price breakdown for frontend display."},"HotelPriceProof":{"properties":{"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"public":{"anyOf":[{"$ref":"#/components/schemas/HotelPriceProofPublic"},{"type":"null"}]},"timing":{"anyOf":[{"$ref":"#/components/schemas/HotelPriceProofTiming"},{"type":"null"}]}},"type":"object","required":["checked_at","expires_at"],"title":"HotelPriceProof","description":"Completed fresh price check; claims remain optional and independent."},"HotelPriceProofPublic":{"properties":{"provider":{"type":"string","enum":["Expedia","Booking.com"],"title":"Provider"},"axel_total":{"$ref":"#/components/schemas/Money"},"public_total":{"$ref":"#/components/schemas/Money"},"savings_percent":{"type":"integer","maximum":99.0,"minimum":2.0,"title":"Savings Percent"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"}},"type":"object","required":["provider","axel_total","public_total","savings_percent"],"title":"HotelPriceProofPublic","description":"A fresh, checkable public-OTA comparison that Axel wins."},"HotelPriceProofTiming":{"properties":{"percent_below_usual":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Percent Below Usual"}},"type":"object","required":["percent_below_usual"],"title":"HotelPriceProofTiming","description":"Google's independent historical booking-time signal."},"HotelPricesRequestLenient":{"properties":{"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"guests":{"anyOf":[{"$ref":"#/components/schemas/LenientGuestConfig"},{"type":"null"}]},"hotel_search_session_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hotel Search Session Id"},"provider":{"anyOf":[{"$ref":"#/components/schemas/HotelProvider"},{"type":"null"}]}},"type":"object","required":["check_in","check_out"],"title":"HotelPricesRequestLenient","description":"Wire form of HotelPricesRequest for client-facing routes.\n\n`guests` is optional and parses leniently on purpose: the search session\nis the source of truth for occupancy, so clients with a\nhotel_search_session_id should omit guests entirely and let the handler\nresolve them from the session. A supplied config parses without supplier\ncaps so a client-mangled value (e.g. a checkout overlay that flattened\n\"8 rooms x 4 adults\" into one 32-adult room) still reaches the handler —\nwhere the session's guests replace it — instead of 422ing at request\nparsing. Handlers convert to HotelPricesRequest after resolving occupancy;\nsessionless requests must supply guests that pass strict validation."},"HotelProvider":{"type":"string","enum":["etg","webbeds","axel_discount_etg","axel_discount_webbeds"],"title":"HotelProvider","description":"Hotel pricing provider identifier.\n\nMatches the `source` field on HotelObservation / HotelOffer and the\n`supplier` column on hotel_quotes. Used to filter detail-pricing requests\nso the FE can ask for a specific provider's offers after the SERP card\nsurfaces which provider won the cheapest-price race."},"HotelPurchaseStatusResponse":{"properties":{"hotel_purchase_id":{"type":"string","format":"uuid","title":"Hotel Purchase Id"},"state":{"type":"string","title":"State"},"display_state":{"type":"string","title":"Display State"},"membership_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Membership Status"},"final_charge_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Final Charge Amount Cents"},"final_charge_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Charge Currency"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"failure_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Code"},"credit_applied_cents":{"type":"integer","title":"Credit Applied Cents","default":0},"supplier_confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supplier Confirmation Code"}},"type":"object","required":["hotel_purchase_id","state","display_state"],"title":"HotelPurchaseStatusResponse"},"HotelScreenshotParseResponse":{"properties":{"booking_type":{"type":"string","const":"hotel","title":"Booking Type","default":"hotel"},"parsed_fields":{"$ref":"#/components/schemas/HotelBookingData-Output"},"form_fields":{"$ref":"#/components/schemas/HotelFormFields"}},"type":"object","required":["parsed_fields","form_fields"],"title":"HotelScreenshotParseResponse","description":"Response from hotel screenshot parsing."},"HotelSearchAnchor":{"properties":{"latitude":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Latitude"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Longitude"},"radius_km":{"type":"number","maximum":50.0,"exclusiveMinimum":0.0,"title":"Radius Km"},"label":{"type":"string","minLength":1,"title":"Label"},"source":{"$ref":"#/components/schemas/HotelSearchAnchorSource"},"place_code":{"anyOf":[{"type":"string","maxLength":32,"minLength":1},{"type":"null"}],"title":"Place Code"}},"type":"object","required":["latitude","longitude","radius_km","label","source"],"title":"HotelSearchAnchor","description":"Canonical search anchor for a hotel map session.\n\nExtends LocationRadius to keep the existing flat latitude/longitude/radius_km\nshape while adding the label/type metadata FE needs.\n\nThis prevents map-first hotel search from falling back to a vague\ndestination code or implicit city centroid."},"HotelSearchAnchorSource":{"type":"string","enum":["city","neighborhood","hotel","airport","user_phrase","map"],"title":"HotelSearchAnchorSource","description":"Source/type of the canonical hotel map search anchor."},"HotelSearchBookingSessionCreate":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id","description":"Hotel identifier"},"quote_id":{"type":"string","title":"Quote Id","description":"Selected quote identifier"},"check_in":{"type":"string","format":"date","title":"Check In","description":"Check-in date"},"check_out":{"type":"string","format":"date","title":"Check Out","description":"Check-out date"},"checkout_step":{"type":"string","enum":["review","guests","membership","payment","processing","confirmed","failed"],"title":"Checkout Step","description":"Current step in checkout flow"},"status":{"type":"string","enum":["active","processing","completed","failed","abandoned"],"title":"Status","default":"active"},"is_valid":{"type":"boolean","title":"Is Valid","description":"Whether the session is still valid for resume/banner display","default":true},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Snapshot payload from frontend (hotel details, offer, guests, etc)"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"hotel_purchase_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Purchase Id"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"replacement_for_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement For Booking Id","description":"Optional imported booking ID this checkout is intended to replace."},"conv_trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Id","description":"Optional conversational trip ID (string) carried through checkout"},"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name","description":"Hotel property name for display in payment block"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type","description":"Selected room type name for display in payment block"},"price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Amount","description":"Total customer price in cents for display in payment block"},"price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Currency","description":"Currency code for price (e.g. USD)"},"cancellation_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Policy","description":"Cancellation policy text (e.g. 'Free cancellation until Apr 30')"},"fees_at_property_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fees At Property Amount","description":"Total mandatory fees in cents due at property (resort fee, city tax, etc.)"},"fees_at_property_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fees At Property Currency","description":"Currency code for fees_at_property (e.g. EUR, USD). Often local currency."},"retail_price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retail Price Amount","description":"Retail comparison price in cents (e.g. Expedia) for strikethrough display"},"retail_price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retail Price Currency","description":"Currency code for retail price (e.g. USD)"},"wake_token_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wake Token Hash","description":"SHA-256 hex hash of the wake token this checkout originated from. Write-through attribution only — never the raw token. Absence must not block checkout."},"src":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Src","description":"Short deeplink source slug the checkout originated from (e.g. 'wake_limited_time_flight_offer'). Write-through attribution only."}},"type":"object","required":["hotel_id","quote_id","check_in","check_out","checkout_step"],"title":"HotelSearchBookingSessionCreate","description":"Create or upsert a persisted hotel-search checkout session."},"HotelSearchBookingSessionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"hotel_id":{"type":"integer","title":"Hotel Id"},"quote_id":{"type":"string","title":"Quote Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"checkout_step":{"type":"string","enum":["review","guests","membership","payment","processing","confirmed","failed"],"title":"Checkout Step"},"status":{"type":"string","enum":["active","processing","completed","failed","abandoned"],"title":"Status"},"is_valid":{"type":"boolean","title":"Is Valid"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"hotel_purchase_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Purchase Id"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"replacement_for_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement For Booking Id"},"conv_trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Id"},"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Amount"},"price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Currency"},"cancellation_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Policy"},"fees_at_property_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fees At Property Amount"},"fees_at_property_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fees At Property Currency"},"retail_price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retail Price Amount"},"retail_price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retail Price Currency"},"guest_names":{"items":{"type":"string"},"type":"array","title":"Guest Names","description":"Guest names extracted from guest_rooms in payload"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"readOnly":true},"fees_at_property":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"readOnly":true},"retail_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"readOnly":true},"price_breakdown":{"anyOf":[{"$ref":"#/components/schemas/HotelPriceBreakdown"},{"type":"null"}],"readOnly":true}},"type":"object","required":["id","user_id","hotel_id","quote_id","check_in","check_out","checkout_step","status","is_valid","payload","booking_id","hotel_purchase_id","confirmation_code","failure_reason","created_at","updated_at","price","fees_at_property","retail_price","price_breakdown"],"title":"HotelSearchBookingSessionResponse","description":"Persisted hotel-search checkout session."},"HotelSearchBookingSessionUpdate":{"properties":{"checkout_step":{"anyOf":[{"type":"string","enum":["review","guests","membership","payment","processing","confirmed","failed"]},{"type":"null"}],"title":"Checkout Step"},"status":{"anyOf":[{"type":"string","enum":["active","processing","completed","failed","abandoned"]},{"type":"null"}],"title":"Status"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Id"},"hotel_purchase_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Purchase Id"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"replacement_for_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement For Booking Id"},"conv_trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Id"}},"type":"object","title":"HotelSearchBookingSessionUpdate","description":"Patch a persisted hotel-search checkout session."},"HotelSearchCriteria":{"properties":{"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"guests":{"$ref":"#/components/schemas/HotelSearchGuestConfig"},"anchor":{"$ref":"#/components/schemas/HotelSearchAnchor"}},"additionalProperties":false,"type":"object","required":["check_in","check_out","guests","anchor"],"title":"HotelSearchCriteria","description":"Criteria snapshot for a hotel search session/map token.\n\nCriteria changes create a new hotel search session; FE should reject stale\nupdates whose criteria_hash does not match the active map instance."},"HotelSearchDefaults":{"properties":{"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"guests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Guests"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"}},"type":"object","title":"HotelSearchDefaults"},"HotelSearchGuestConfig":{"properties":{"rooms":{"items":{"$ref":"#/components/schemas/GuestRoom-Output"},"type":"array","maxItems":9,"minItems":1,"title":"Rooms"}},"type":"object","required":["rooms"],"title":"HotelSearchGuestConfig","description":"Wraps a list of GuestRoom into a typed config object for the discovery API.\n\nReuses the shared GuestRoom model — just adds a container with validation."},"HotelSearchPricingStatus":{"type":"string","enum":["pending","in_progress","complete"],"title":"HotelSearchPricingStatus","description":"Tracks where we are in the live pricing lifecycle for a query.\n\nClient polls the query endpoint and checks this to know when to stop."},"HotelSearchQueryRequest":{"properties":{"viewport":{"anyOf":[{"$ref":"#/components/schemas/Viewport"},{"type":"null"}]},"location":{"anyOf":[{"$ref":"#/components/schemas/LocationRadius"},{"type":"null"}]},"zoom_level":{"anyOf":[{"type":"integer","maximum":22.0,"minimum":1.0},{"type":"null"}],"title":"Zoom Level","description":"Density hint for clustering. When provided, the server groups nearby hotels into clusters at a resolution derived from this value. When absent, no clustering — returns a flat ranked list."},"cluster_threshold":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Cluster Threshold","description":"Minimum hotels in an H3 cell to form a cluster (default 9). Hotels in cells with fewer are returned as individual pins."},"filters":{"anyOf":[{"$ref":"#/components/schemas/SearchFilters"},{"type":"null"}],"description":"When provided, replaces the session filters and invalidates filter-dependent map/sort caches. Omit to reuse the persisted session filters for polling."},"sort":{"$ref":"#/components/schemas/HotelSearchSortOrder","default":"relevance"},"sort_reference_point":{"anyOf":[{"$ref":"#/components/schemas/LatLng"},{"type":"null"}]}},"type":"object","title":"HotelSearchQueryRequest","description":"Query hotels within a viewport or radius. Idempotent — client polls\nthis same endpoint to pick up live prices as they resolve from providers.\n\nProvide either viewport (map pan/zoom) or location (initial search), not both."},"HotelSearchQueryResponse":{"properties":{"query_id":{"type":"string","title":"Query Id"},"session_id":{"type":"string","format":"uuid","title":"Session Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"nights":{"type":"integer","title":"Nights"},"guests":{"$ref":"#/components/schemas/HotelSearchGuestConfig"},"filters":{"anyOf":[{"$ref":"#/components/schemas/SearchFilters"},{"type":"null"}]},"criteria":{"$ref":"#/components/schemas/HotelSearchCriteria"},"criteria_hash":{"type":"string","minLength":8,"title":"Criteria Hash"},"anchor":{"$ref":"#/components/schemas/HotelSearchAnchor"},"loaded_bounds":{"$ref":"#/components/schemas/Viewport"},"hotels":{"items":{"$ref":"#/components/schemas/HotelSearchResult"},"type":"array","title":"Hotels"},"clusters":{"items":{"$ref":"#/components/schemas/HotelCluster"},"type":"array","title":"Clusters"},"clusters_by_zoom":{"anyOf":[{"$ref":"#/components/schemas/ClustersByZoom"},{"type":"null"}]},"total_in_area":{"type":"integer","title":"Total In Area"},"pricing_status":{"$ref":"#/components/schemas/HotelSearchPricingStatus"},"hotels_priced":{"type":"integer","title":"Hotels Priced","default":0},"hotels_unavailable":{"type":"integer","title":"Hotels Unavailable","default":0},"pricing_pool_size":{"type":"integer","title":"Pricing Pool Size","default":0},"pricing_requested_count":{"type":"integer","title":"Pricing Requested Count","default":0},"hotels_with_compare_price":{"type":"integer","title":"Hotels With Compare Price","default":0},"retry_after_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After Ms"},"unavailable_hotel_ids":{"items":{"type":"integer"},"type":"array","title":"Unavailable Hotel Ids"}},"type":"object","required":["query_id","session_id","check_in","check_out","nights","guests","criteria","criteria_hash","anchor","loaded_bounds","hotels","total_in_area","pricing_status"],"title":"HotelSearchQueryResponse","description":"Response from the query endpoint. Client polls this to get progressive updates.\n\nFirst call returns Phase 1 (hotel pins + cached prices, pricing_status=pending).\nSubsequent polls return the same structure with live prices filled in and\npricing_status progressing to in_progress then complete.\n\nIncludes session metadata so the client never needs a separate GET endpoint.\nREST map surfaces should use this response directly; HotelMapToken is reserved\nfor chat-embedded map tokens."},"HotelSearchResult":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"name":{"type":"string","title":"Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"review_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Rating"},"review_rating_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Rating Source"},"hotel_chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Chain"},"address":{"type":"string","title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"price":{"anyOf":[{"$ref":"#/components/schemas/HotelPrice"},{"type":"null"}]},"compare_price":{"anyOf":[{"$ref":"#/components/schemas/ComparePrice"},{"type":"null"}]},"price_proof":{"anyOf":[{"$ref":"#/components/schemas/HotelPriceProof"},{"type":"null"}]},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"cluster_below_zoom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cluster Below Zoom"},"debug":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Debug"}},"type":"object","required":["hotel_id","name","latitude","longitude","address"],"title":"HotelSearchResult","description":"Hotel summary returned in a search query — metadata, price, and relevance score."},"HotelSearchSessionResponse":{"properties":{"session_id":{"type":"string","format":"uuid","title":"Session Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"nights":{"type":"integer","title":"Nights"},"guests":{"$ref":"#/components/schemas/HotelSearchGuestConfig"},"filters":{"anyOf":[{"$ref":"#/components/schemas/SearchFilters"},{"type":"null"}]},"criteria":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchCriteria"},{"type":"null"}]},"criteria_hash":{"anyOf":[{"type":"string","minLength":8},{"type":"null"}],"title":"Criteria Hash"},"anchor":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchAnchor"},{"type":"null"}]},"loaded_bounds":{"anyOf":[{"$ref":"#/components/schemas/Viewport"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"},"initial_results":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchQueryResponse"},{"type":"null"}]}},"type":"object","required":["session_id","check_in","check_out","nights","guests","filters","created_at","expires_at"],"title":"HotelSearchSessionResponse","description":"Returned when creating a session.\n\nIf initial_location was provided at creation, initial_results contains\nPhase 1 hotel pins so the client can render immediately."},"HotelSearchSessionStatusResponse":{"properties":{"session_id":{"type":"string","format":"uuid","title":"Session Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"guests":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchGuestConfig"},{"type":"null"}]},"pricing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"},"is_expired":{"type":"boolean","title":"Is Expired"}},"type":"object","required":["session_id","check_in","check_out","created_at","expires_at","is_expired"],"title":"HotelSearchSessionStatusResponse","description":"Lightweight session status for freshness checks (ENG-21888).\n\nRead-only: fetching this must never touch/extend the session TTL or\ntrigger re-pricing. `is_expired` reflects `expires_at` at read time —\nan expired session is still re-priceable via `/query`, but its quoted\nprices must not be presented to a user as current."},"HotelSearchSortOrder":{"type":"string","enum":["relevance","price","star_rating","review_score","distance"],"title":"HotelSearchSortOrder","description":"How to order hotel results in the list/map view."},"HotelSetupStatus":{"properties":{"complete":{"type":"boolean","title":"Complete"},"auto_reprice_hotels":{"type":"boolean","title":"Auto Reprice Hotels"}},"type":"object","required":["complete","auto_reprice_hotels"],"title":"HotelSetupStatus"},"HotelStaticDataResponse":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"etg_provider_id":{"type":"string","title":"Etg Provider Id"},"expedia_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expedia Id"},"name":{"type":"string","title":"Name"},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"review_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Rating"},"review_rating_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Rating Source"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Time"},"images":{"items":{"$ref":"#/components/schemas/HotelImage"},"type":"array","title":"Images"},"descriptions":{"items":{"$ref":"#/components/schemas/DescriptionSection"},"type":"array","title":"Descriptions"},"amenities":{"items":{"$ref":"#/components/schemas/AmenityGroup"},"type":"array","title":"Amenities"},"room_groups":{"items":{"$ref":"#/components/schemas/RoomGroup"},"type":"array","title":"Room Groups"},"serp_filters":{"items":{"type":"string"},"type":"array","title":"Serp Filters"},"policy":{"items":{"$ref":"#/components/schemas/DescriptionSection"},"type":"array","title":"Policy"},"payment_methods":{"items":{"type":"string"},"type":"array","title":"Payment Methods"},"contact":{"anyOf":[{"$ref":"#/components/schemas/ContactInfo"},{"type":"null"}]},"facts":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Facts"}},"type":"object","required":["hotel_id","etg_provider_id","name"],"title":"HotelStaticDataResponse","description":"Rich static data for a hotel detail page.\n\nSourced from ETG provider data linked to the master hotel record."},"HotelStayResponse":{"properties":{"booking_id":{"type":"string","title":"Booking Id"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name"},"hotel_chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Chain"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"check_in_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Date"},"check_out_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Date"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"number_of_rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number Of Rooms"},"status":{"type":"string","title":"Status"}},"type":"object","required":["booking_id","status"],"title":"HotelStayResponse","description":"Hotel stay for list view."},"HotelWakeLinkResolveResponse":{"properties":{"trip_id":{"type":"string","title":"Trip Id"},"src":{"type":"string","title":"Src"},"currency":{"type":"string","title":"Currency"},"wake_token_hash":{"type":"string","title":"Wake Token Hash","description":"Privacy-safe SHA-256 of the wake-link token. Lets the web app attach wake attribution to existing hotel checkout signals without exposing the raw token (which is the secret)."},"target":{"$ref":"#/components/schemas/WakeLinkHotelTarget"},"hotel_id":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Hotel Id"},"hotel_search_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Search Session Id"},"hotel_negotiation_offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Negotiation Offer Id"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO timestamp when the locked hotel negotiation offer expires."},"quote_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote Id"},"check_in":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out"},"open_checkout":{"type":"boolean","title":"Open Checkout"},"hotel_map":{"anyOf":[{"$ref":"#/components/schemas/HotelNegotiationMapPayload"},{"type":"null"}]},"rendered_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rendered Token"},"locked_customer_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"locked_nightly_rate":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"expedia_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"savings_amount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"star_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Star Rating"},"compare_price_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compare Price Provider"},"compare_price_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compare Price Source"},"is_refundable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Refundable"},"savings_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Savings Percent","description":"Fraction saved vs the comparison price, e.g. 0.22 = 22%."},"message_facts":{"anyOf":[{"$ref":"#/components/schemas/HotelNegotiationMessageFacts"},{"type":"null"}]}},"type":"object","required":["trip_id","src","currency","wake_token_hash","target","open_checkout"],"title":"HotelWakeLinkResolveResponse","description":"Resolve response for hotel map and hotel negotiation wake links."},"IntercomSessionResponse":{"properties":{"app_id":{"type":"string","title":"App Id"},"intercom_user_jwt":{"type":"string","title":"Intercom User Jwt"},"expires_at":{"type":"integer","title":"Expires At"}},"type":"object","required":["app_id","intercom_user_jwt","expires_at"],"title":"IntercomSessionResponse","description":"Signed Intercom Messenger session material for the authenticated user."},"InternalProxyRequest":{"properties":{"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"],"title":"Method","description":"HTTP method to use"},"service":{"type":"string","enum":["content","travel","users","payments","communications","axel-brain","conv-brain","travel-email"],"title":"Service","description":"Target internal service"},"path":{"type":"string","pattern":"^/.*","title":"Path","description":"API path on the service (e.g., /api/v1/hotels/123/images)"},"body":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Body","description":"Request body (for POST/PUT/PATCH)"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"Additional headers to include"},"timeout":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout","description":"Request timeout in seconds (1-120)","default":30},"query_params":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Query Params","description":"Query parameters to append to the path"}},"type":"object","required":["method","service","path"],"title":"InternalProxyRequest","description":"Request to proxy to an internal service."},"InternalProxyResponse":{"properties":{"status_code":{"type":"integer","title":"Status Code","description":"HTTP status code from internal service"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","description":"Response headers"},"body":{"title":"Body","description":"Response body (parsed JSON or raw text)"},"elapsed_ms":{"type":"integer","title":"Elapsed Ms","description":"Request duration in milliseconds"},"service":{"type":"string","title":"Service","description":"Service that was called"},"path":{"type":"string","title":"Path","description":"Path that was called"}},"type":"object","required":["status_code","headers","body","elapsed_ms","service","path"],"title":"InternalProxyResponse","description":"Response from the proxied internal service."},"LLMClaimField":{"type":"string","enum":["fare_product","seat_extra","cabin","booking_class","price"],"title":"LLMClaimField","description":"Parser claim category captured from the LLM output."},"LLMParseClaim":{"properties":{"field":{"$ref":"#/components/schemas/LLMClaimField"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"evidence_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence Text"},"confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"is_purchased_fare":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Purchased Fare"}},"additionalProperties":true,"type":"object","required":["field"],"title":"LLMParseClaim","description":"One semantic claim made by the LLM parser."},"LatLng":{"properties":{"latitude":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Latitude"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Longitude"}},"type":"object","required":["latitude","longitude"],"title":"LatLng","description":"Geographic coordinate pair. Used by both pricing and discovery APIs."},"LenientGuestConfig":{"properties":{"rooms":{"items":{"$ref":"#/components/schemas/LenientGuestRoom"},"type":"array","minItems":1,"title":"Rooms"}},"type":"object","required":["rooms"],"title":"LenientGuestConfig","description":"Container for LenientGuestRoom; see that model's docstring."},"LenientGuestRoom":{"properties":{"adults":{"type":"integer","minimum":1.0,"title":"Adults"},"children":{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array","title":"Children"}},"type":"object","required":["adults"],"title":"LenientGuestRoom","description":"Parse-only guest room for endpoints that resolve occupancy server-side.\n\nMirrors GuestRoom's shape without its supplier caps (adults le=10, child\nage range) so a malformed client occupancy — e.g. a checkout overlay that\nflattens \"8 rooms x 4 adults\" into one 32-adult room — survives request\nparsing instead of 422ing at the gateway. It must never reach a supplier:\nthe prices endpoint replaces it with the search session's guests, and\nwithout a session re-validates it as HotelSearchGuestConfig first."},"LinkedGmailAccount":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"email_address":{"type":"string","title":"Email Address"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["credential_id","email_address","created_at"],"title":"LinkedGmailAccount","description":"A linked Gmail account."},"LocationRadius":{"properties":{"latitude":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Latitude"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Longitude"},"radius_km":{"type":"number","maximum":50.0,"exclusiveMinimum":0.0,"title":"Radius Km"}},"type":"object","required":["latitude","longitude","radius_km"],"title":"LocationRadius","description":"Center point with radius — used for the initial search before the user\nhas a map viewport (e.g. \"hotels in Tokyo\" resolves to a lat/lng + radius)."},"LoyaltyMembership":{"properties":{"program_id":{"type":"string","title":"Program Id"},"number":{"type":"string","title":"Number"}},"type":"object","required":["program_id","number"],"title":"LoyaltyMembership","description":"Loyalty program membership."},"MandatoryFee":{"properties":{"name":{"type":"string","title":"Name"},"fee_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Type"},"unit_amount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"pricing_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Unit"},"total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["name"],"title":"MandatoryFee","description":"A fee the guest must pay (e.g. city tax, resort fee). Returned from\nproviders as part of the pricing breakdown."},"ManualFlightBookingRequest":{"properties":{"parsed_data":{"$ref":"#/components/schemas/FlightBookingData-Input","description":"Full parsed blob from parse-screenshot endpoint"},"record_locator":{"type":"string","title":"Record Locator"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"origin_airport":{"type":"string","maxLength":3,"title":"Origin Airport"},"destination_airport":{"type":"string","maxLength":3,"title":"Destination Airport"},"departure_date":{"type":"string","format":"date","title":"Departure Date"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date","description":"Return date for roundtrip flights (when parsed_data has leg_index=1 segments)"},"cash_paid":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Cash Paid"},"cash_currency":{"type":"string","maxLength":3,"title":"Cash Currency"},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Brain trip document UUID from conversation card"}},"type":"object","required":["parsed_data","record_locator","first_name","last_name","origin_airport","destination_airport","departure_date","cash_paid","cash_currency"],"title":"ManualFlightBookingRequest","description":"Request body for creating a flight booking from screenshot + form."},"ManualHotelBookingRequest":{"properties":{"parsed_data":{"$ref":"#/components/schemas/HotelBookingData-Input","description":"Full parsed blob from parse-screenshot endpoint"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"hotel_name":{"type":"string","maxLength":255,"title":"Hotel Name"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"cash_paid":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Cash Paid"},"cash_currency":{"type":"string","maxLength":3,"title":"Cash Currency"},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Brain trip document UUID from conversation card"}},"type":"object","required":["parsed_data","first_name","last_name","hotel_name","confirmation_number","check_in_date","check_out_date","cash_paid","cash_currency"],"title":"ManualHotelBookingRequest","description":"Request body for creating a hotel booking from screenshot + form."},"MeResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"phone_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Country Code","description":"ISO 3166-1 alpha-2 country inferred from the user's phone number"},"display_currency_preference":{"anyOf":[{"type":"string","enum":["USD","CAD"]},{"type":"null"}],"title":"Display Currency Preference","description":"User-selected display currency. Null means no explicit choice yet."},"usd_to_cad_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usd To Cad Rate","description":"Latest cached USD to CAD exchange rate for display estimates"},"usd_to_cad_rate_fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Usd To Cad Rate Fetched At","description":"When the latest cached USD to CAD exchange rate was fetched"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"status":{"type":"string","title":"Status"},"account_state":{"type":"string","enum":["pending_email","complete"],"title":"Account State","default":"complete"},"member_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Since"},"email_slug":{"type":"string","title":"Email Slug"},"is_email_verified":{"type":"boolean","title":"Is Email Verified","description":"Whether the user's primary email is verified"},"lifetime_savings":{"$ref":"#/components/schemas/Money","description":"Total lifetime savings with Axel (USD): below-market deltas on bookings plus repricing rescues (ENG-29973)"},"axel_credit_balance":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Available Axel credits"},"axel_credit_restricted":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Portion of axel_credit_balance (referred-user welcome credit) usable only on purchases of at least axel_credit_min_purchase"},"axel_credit_min_purchase":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Minimum purchase total required to apply the restricted credit portion"},"gmail_accounts":{"items":{"$ref":"#/components/schemas/LinkedGmailAccount"},"type":"array","title":"Gmail Accounts","default":[]},"private_promo_codes":{"items":{"$ref":"#/components/schemas/UserPromoCodeResponse"},"type":"array","title":"Private Promo Codes"},"has_referrer":{"type":"boolean","title":"Has Referrer","default":false},"referred_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referred Code"},"membership_status":{"type":"string","enum":["free","paying","referred","lapsed"],"title":"Membership Status"},"show_upgrade_cta":{"type":"boolean","title":"Show Upgrade Cta"},"verified_emails":{"items":{"type":"string"},"type":"array","title":"Verified Emails","description":"User's verified email addresses they can forward from"},"forwarding_address":{"type":"string","title":"Forwarding Address","description":"Email address for forwarding booking confirmations"},"auto_reprice_flights":{"type":"boolean","title":"Auto Reprice Flights","description":"Automatically approve flight repricing opportunities"},"auto_reprice_hotels":{"type":"boolean","title":"Auto Reprice Hotels","description":"Automatically approve hotel repricing opportunities"},"action_threshold_usd":{"type":"integer","title":"Action Threshold Usd","description":"Minimum savings (USD) to notify about opportunities"},"quiet_hours_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quiet Hours Start","description":"Start of quiet hours (0-23, local time)"},"quiet_hours_end":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quiet Hours End","description":"End of quiet hours (0-23, local time)"},"sms_opted_in":{"type":"boolean","title":"Sms Opted In","description":"Whether the user has explicitly opted in to non-OTP SMS"},"sms_opted_out":{"type":"boolean","title":"Sms Opted Out","description":"Whether the user has an active SMS opt-out state"},"setup_status":{"anyOf":[{"$ref":"#/components/schemas/SetupStatus"},{"type":"null"}]}},"type":"object","required":["id","status","email_slug","is_email_verified","lifetime_savings","membership_status","show_upgrade_cta","forwarding_address","auto_reprice_flights","auto_reprice_hotels","action_threshold_usd","sms_opted_in","sms_opted_out"],"title":"MeResponse","description":"Response for current user profile and settings."},"MembershipPlanResponse":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price_monthly_cents_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Monthly Cents Usd"},"price_yearly_cents_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Yearly Cents Usd"},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"MembershipPlanResponse","description":"Schema for membership plan responses."},"MembershipResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"plan_id":{"type":"string","format":"uuid","title":"Plan Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","plan_id","status","started_at","expires_at","cancelled_at","created_at","updated_at"],"title":"MembershipResponse","description":"Schema for membership responses."},"MembershipSetupStatus":{"properties":{"show":{"type":"boolean","title":"Show"},"complete":{"type":"boolean","title":"Complete"},"plan":{"type":"string","title":"Plan"}},"type":"object","required":["show","complete","plan"],"title":"MembershipSetupStatus"},"MembershipWithReferrer":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"plan_id":{"type":"string","format":"uuid","title":"Plan Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"plan_slug":{"type":"string","title":"Plan Slug"},"plan_name":{"type":"string","title":"Plan Name"},"plan_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Description"},"referral_eligible":{"type":"boolean","title":"Referral Eligible"},"price_cents_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Cents Usd"},"referred_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Referred By"},"referrer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Name"},"is_member":{"type":"boolean","title":"Is Member","description":"Whether user is a member (has full access via paid or referred plan).","readOnly":true}},"type":"object","required":["id","user_id","plan_id","status","started_at","expires_at","cancelled_at","created_at","updated_at","plan_slug","plan_name","plan_description","referral_eligible","price_cents_usd","referred_by","is_member"],"title":"MembershipWithReferrer","description":"Membership response with referrer name resolved."},"MetaTrackingData":{"properties":{"fbp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbp"},"fbc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbc"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"}},"type":"object","title":"MetaTrackingData","description":"Meta-specific tracking data sent from the frontend."},"Money":{"properties":{"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["amount","currency"],"title":"Money","description":"Immutable money value stored as integer minor units.\n\nAmount is always stored in the smallest currency unit (cents, yen, pesos, etc).\nThis avoids floating-point precision issues and matches payment processor standards.\n\nExamples:\n    $19.99 USD -> Money(amount=1999, currency=\"USD\")\n    ¥1000 JPY -> Money(amount=1000, currency=\"JPY\")\n    $1000.00 CLP -> Money(amount=1000, currency=\"CLP\")\n\nSerializes to {\"amount\": 1999, \"currency\": \"USD\"}.\n\nIMPORTANT: Use Money.from_decimal() for user-facing amounts like \"$19.99\".\nThe constructor expects integer minor units (cents)."},"MyBookingPaymentMethod":{"properties":{"brand":{"type":"string","title":"Brand"},"last4":{"type":"string","title":"Last4"}},"type":"object","required":["brand","last4"],"title":"MyBookingPaymentMethod","description":"Saved card summary for display."},"MyBookingsResponse":{"properties":{"bookings":{"items":{"oneOf":[{"$ref":"#/components/schemas/MyFlightBooking"},{"$ref":"#/components/schemas/MyHotelBooking"}],"discriminator":{"propertyName":"booking_type","mapping":{"flight":"#/components/schemas/MyFlightBooking","hotel":"#/components/schemas/MyHotelBooking"}}},"type":"array","title":"Bookings"},"upcoming_count":{"type":"integer","title":"Upcoming Count","default":0},"needs_payment_count":{"type":"integer","title":"Needs Payment Count","default":0},"total_savings":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["bookings"],"title":"MyBookingsResponse"},"MyFlightBooking":{"properties":{"id":{"type":"string","title":"Id"},"booking_type":{"type":"string","const":"flight","title":"Booking Type","default":"flight"},"status":{"$ref":"#/components/schemas/BookingStatus"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"booking_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Provider"},"total_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"credit_applied":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"total_savings":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"pricing_breakdown":{"anyOf":[{"$ref":"#/components/schemas/FlightPricingBreakdown"},{"type":"null"}]},"axel_deal_savings":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"travel_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Travel Date"},"is_past":{"type":"boolean","title":"Is Past","default":false},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id"},"conv_trip_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"segments":{"items":{"$ref":"#/components/schemas/FlightSegmentView"},"type":"array","title":"Segments"},"travelers":{"items":{"$ref":"#/components/schemas/MyFlightTraveler"},"type":"array","title":"Travelers"},"airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Code"},"airline_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Name"},"supports_repricing":{"type":"boolean","title":"Supports Repricing","default":false},"cancellation_request":{"anyOf":[{"$ref":"#/components/schemas/MyFlightCancellationRequest"},{"type":"null"}]},"support_request":{"anyOf":[{"$ref":"#/components/schemas/FlightSupportRequest"},{"type":"null"}]},"modified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified At"},"modification_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modification Note"}},"type":"object","required":["id","status","created_at","segments","support_request"],"title":"MyFlightBooking"},"MyFlightCancellationRequest":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"refund_status":{"type":"string","title":"Refund Status"},"supplier_status":{"type":"string","title":"Supplier Status"},"auto_refund_eligible":{"type":"boolean","title":"Auto Refund Eligible","default":false},"refund_review_requested":{"type":"boolean","title":"Refund Review Requested","default":false},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"refund_amount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["id","status","refund_status","supplier_status","requested_at"],"title":"MyFlightCancellationRequest"},"MyFlightTraveler":{"properties":{"first_name":{"type":"string","title":"First Name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name"},"last_name":{"type":"string","title":"Last Name","default":""},"display_name":{"type":"string","title":"Display Name"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"traveler_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traveler Profile Id"}},"type":"object","required":["first_name","display_name"],"title":"MyFlightTraveler","description":"Traveler summary for customer-facing flight booking detail."},"MyHotelBooking":{"properties":{"id":{"type":"string","title":"Id"},"booking_type":{"type":"string","const":"hotel","title":"Booking Type","default":"hotel"},"hotel_purchase_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Purchase Id"},"status":{"$ref":"#/components/schemas/BookingStatus"},"confirmation_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Code"},"booking_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Provider"},"total_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"credit_applied":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"total_savings":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"travel_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Travel Date"},"is_past":{"type":"boolean","title":"Is Past","default":false},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id"},"conv_trip_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conv Trip Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"hotel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Id"},"hotel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Name"},"hotel_chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hotel Chain"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"check_in_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In Date"},"check_out_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out Date"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"guests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Guests"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls","description":"Hotel image URLs in display order (max 5). The FE should fall back to the next URL when one fails to load, e.g. expired Google Places photo URLs returning 403."},"needs_payment":{"type":"boolean","title":"Needs Payment","default":false},"payment_method":{"anyOf":[{"$ref":"#/components/schemas/MyBookingPaymentMethod"},{"type":"null"}]}},"type":"object","required":["id","status","created_at"],"title":"MyHotelBooking"},"OfferDeposit":{"properties":{"amount":{"$ref":"#/components/schemas/Money"},"is_refundable":{"type":"boolean","title":"Is Refundable","default":true}},"type":"object","required":["amount"],"title":"OfferDeposit","description":"Card hold required at booking time. Returned from provider per rate."},"OfferPricing":{"properties":{"nightly_rate":{"$ref":"#/components/schemas/Money"},"member_nightly_rate":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"total_customer_price":{"$ref":"#/components/schemas/Money"},"member_total_customer_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"total_due":{"$ref":"#/components/schemas/Money"},"member_total_due":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"total_at_property":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"mandatory_fees":{"items":{"$ref":"#/components/schemas/MandatoryFee"},"type":"array","title":"Mandatory Fees"},"supplier_taxes":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"retail_comparison_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"retail_comparison_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"trip_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"trip_total_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_trip_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"member_trip_total_nightly":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["nightly_rate","total_customer_price","total_due"],"title":"OfferPricing","description":"Full price breakdown for a single room offer."},"PassengerCount":{"properties":{"adults":{"type":"integer","title":"Adults","default":1},"children":{"type":"integer","title":"Children","default":0},"infants_in_seat":{"type":"integer","title":"Infants In Seat","default":0},"infants_on_lap":{"type":"integer","title":"Infants On Lap","default":0}},"additionalProperties":false,"type":"object","title":"PassengerCount","description":"Passenger breakdown for offers/searches.\n\nSimple counts by type."},"PassengerInput":{"properties":{"traveler_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Traveler Profile Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","description":"Passenger's first/given name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name","description":"Passenger's middle name, if present"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name","description":"Passenger's last/family name"},"passenger_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Passenger Type","description":"Passenger type: adult, child, infant_in_seat, or infant_on_lap"},"seat_assignment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seat Assignment","description":"Assigned seat, e.g., '12A', '23F'"},"ticket_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Number","description":"E-ticket number, usually 13 digits"},"boarding_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boarding Group","description":"Boarding group or zone, e.g., '1', 'A', 'Group 3'"},"frequent_flyer_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequent Flyer Number","description":"Frequent flyer/loyalty program number"}},"type":"object","title":"PassengerInput","description":"Flexible passenger input schema.\n\nCan specify either:\n- An existing traveler_profile_id to link to\n- Name details to match/create a TravelerProfile"},"PassengerUpdateRequest":{"properties":{"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth","description":"Passenger date of birth (ISO 8601 date)"},"citizenship":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Citizenship","description":"Passenger citizenship (ISO 3166-1 alpha-2 country code)"},"is_primary":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Primary","description":"Whether this passenger is the primary traveler"}},"type":"object","title":"PassengerUpdateRequest","description":"Request body for updating a passenger on a booking."},"Passport":{"properties":{"country":{"type":"string","maxLength":2,"title":"Country"},"number":{"type":"string","title":"Number"},"expiry":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expiry"}},"type":"object","required":["country","number"],"title":"Passport","description":"Passport details for a traveler."},"PaymentMethodsResponse":{"properties":{"payment_methods":{"items":{"$ref":"#/components/schemas/CardDetails"},"type":"array","title":"Payment Methods"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"}},"type":"object","required":["payment_methods"],"title":"PaymentMethodsResponse"},"PhoneStatusResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"PhoneStatusResponse","description":"Response for phone status check."},"PinFlightRequest":{"properties":{"outbound_observation_id":{"type":"string","title":"Outbound Observation Id"},"return_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Observation Id"},"fare_observation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Observation Id"},"price_watch":{"anyOf":[{"$ref":"#/components/schemas/FlightPriceWatchRequest"},{"type":"null"}]}},"type":"object","required":["outbound_observation_id"],"title":"PinFlightRequest"},"PinHotelRequest":{"properties":{"observation_id":{"type":"string","title":"Observation Id"}},"type":"object","required":["observation_id"],"title":"PinHotelRequest"},"PrebookHotelPurchaseRequest":{"properties":{"quote_id":{"type":"string","title":"Quote Id","description":"Quote ID from /prices endpoint"}},"type":"object","required":["quote_id"],"title":"PrebookHotelPurchaseRequest"},"PrebookHotelPurchaseResponse":{"properties":{"quote_id":{"type":"string","title":"Quote Id"},"validated_book_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validated Book Hash"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"original_amount_cents":{"type":"integer","title":"Original Amount Cents"},"original_currency":{"type":"string","title":"Original Currency"},"price_changed":{"type":"boolean","title":"Price Changed"}},"type":"object","required":["quote_id","validated_book_hash","amount_cents","currency","original_amount_cents","original_currency","price_changed"],"title":"PrebookHotelPurchaseResponse"},"PriceEvidence":{"properties":{"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"}},"additionalProperties":true,"type":"object","title":"PriceEvidence","description":"Price evidence extracted from source content."},"PriceHistoryPoint":{"properties":{"date":{"type":"string","title":"Date"},"price_cents":{"type":"integer","title":"Price Cents"}},"type":"object","required":["date","price_cents"],"title":"PriceHistoryPoint"},"PriceRange":{"properties":{"min":{"$ref":"#/components/schemas/Money"},"max":{"$ref":"#/components/schemas/Money"}},"type":"object","required":["min","max"],"title":"PriceRange","description":"Min/max price range shown on cluster pins (e.g. \"$120 - $280\")."},"PromoCodeBenefitConfig":{"properties":{"category":{"type":"string","title":"Category","description":"Benefit type, e.g. percentage_discount, fixed_amount, flat_override"},"amount":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Amount","description":"Discount amount for the category"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Additional rule metadata for future promo engines"}},"type":"object","required":["category","amount"],"title":"PromoCodeBenefitConfig","description":"Machine-readable promo benefit configuration."},"RawFlightEvidenceCandidate":{"properties":{"evidence_type":{"type":"string","title":"Evidence Type"},"raw_value":{"type":"string","title":"Raw Value"},"matched_text":{"type":"string","title":"Matched Text"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"trusted":{"type":"boolean","title":"Trusted","default":false},"booking_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Class"},"fare_product_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Product Hint"}},"additionalProperties":true,"type":"object","required":["evidence_type","raw_value","matched_text"],"title":"RawFlightEvidenceCandidate","description":"Untrusted raw snippet that may help humans audit parser misses."},"RedeemCodeRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"RedeemCodeRequest","description":"Request to redeem a user-entered code (promo or referral)."},"RedeemPromoCodeRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"RedeemPromoCodeRequest","description":"Request to assign an enterable promo code to a user."},"ReferralCodeResponse":{"properties":{"code":{"type":"string","title":"Code"},"share_url":{"type":"string","title":"Share Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["code","share_url","created_at"],"title":"ReferralCodeResponse","description":"Response with user's referral code."},"RefundableStatus":{"type":"string","enum":["yes","no","unknown"],"title":"RefundableStatus","description":"Whether a booking is refundable.\n\nYES = booking can be refunded (may have deadline)\nNO = booking is non-refundable\nUNKNOWN = refundability not yet determined"},"RegisterUserRequest":{"properties":{"tracking":{"anyOf":[{"$ref":"#/components/schemas/RegistrationTrackingData"},{"type":"null"}]},"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"},"sms_opted_in":{"type":"boolean","title":"Sms Opted In","default":false},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},"type":"object","title":"RegisterUserRequest","description":"Request body for authenticated user registration."},"RegisterUserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"},"account_state":{"type":"string","enum":["pending_email","complete"],"title":"Account State"},"next_step":{"type":"string","enum":["email","app"],"title":"Next Step"},"is_new_user":{"type":"boolean","title":"Is New User"},"forwarding_slug":{"type":"string","title":"Forwarding Slug"},"reply_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Slug"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","status","account_state","next_step","is_new_user","forwarding_slug","created_at"],"title":"RegisterUserResponse","description":"Response after idempotent registration/session completion."},"RegistrationTrackingData":{"properties":{"meta":{"anyOf":[{"$ref":"#/components/schemas/MetaTrackingData"},{"type":"null"}]},"attribution":{"anyOf":[{"$ref":"#/components/schemas/AttributionData"},{"type":"null"}]},"event_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source Url"}},"type":"object","title":"RegistrationTrackingData","description":"Tracking data sent FROM THE FRONTEND during registration."},"RepriceBlocker":{"type":"string","enum":["basic_economy","award_booking","already_departed","departure_too_soon","booking_cancelled","booking_not_active","supplier_not_supported","insufficient_data","non_refundable_hotel"],"title":"RepriceBlocker","description":"Reasons Axel can't reprice a booking."},"RepriceCapability":{"properties":{"can_reprice":{"type":"boolean","title":"Can Reprice","description":"Whether repricing is possible"},"is_watching":{"type":"boolean","title":"Is Watching","description":"Whether an active watch exists"},"blocker":{"anyOf":[{"$ref":"#/components/schemas/RepriceBlocker"},{"type":"null"}],"description":"Why repricing isn't possible, if applicable"}},"type":"object","required":["can_reprice","is_watching"],"title":"RepriceCapability","description":"What Axel can do with a booking."},"ResendVerificationResponse":{"properties":{"email":{"type":"string","title":"Email"},"message":{"type":"string","title":"Message"}},"type":"object","required":["email","message"],"title":"ResendVerificationResponse","description":"Response after resending verification email."},"RoomGroup":{"properties":{"name":{"type":"string","title":"Name"},"images":{"items":{"type":"string"},"type":"array","title":"Images"},"room_amenities":{"items":{"type":"string"},"type":"array","title":"Room Amenities"},"rg_ext":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rg Ext"},"name_struct":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Name Struct"}},"type":"object","required":["name"],"title":"RoomGroup","description":"A room type with images and attribute codes.\n\n``rg_ext`` contains structured room attributes from ETG:\nbedding, capacity, view, class, quality, balcony, bathroom, etc.\nValues are integer codes (0 = unspecified)."},"RoomOffer":{"properties":{"quote_id":{"type":"string","title":"Quote Id"},"provider":{"type":"string","title":"Provider"},"room_name":{"type":"string","title":"Room Name"},"bed_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bed Type"},"bed_configuration":{"anyOf":[{"type":"string","enum":["king","two_beds"]},{"type":"null"}],"title":"Bed Configuration"},"breakfast_included":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Breakfast Included"},"meal_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meal Plan"},"is_refundable":{"type":"boolean","title":"Is Refundable"},"free_cancellation_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Cancellation Until"},"customer_pay_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Customer Pay By"},"cancellation_penalty_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Penalty Description"},"cancel_restricted":{"type":"boolean","title":"Cancel Restricted","default":false},"amend_restricted":{"type":"boolean","title":"Amend Restricted","default":false},"rooms_available":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms Available"},"rate_identity_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Identity Json"},"pricing":{"$ref":"#/components/schemas/OfferPricing"},"deposit":{"anyOf":[{"$ref":"#/components/schemas/OfferDeposit"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"tariff_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Notes"},"min_stay_nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Stay Nights"},"min_stay_applies_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Min Stay Applies From"},"special_promotions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Special Promotions"},"minimum_selling_price":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["quote_id","provider","room_name","is_refundable","pricing"],"title":"RoomOffer","description":"A single bookable room option within a hotel detail view.\n\nMultiple RoomOffers are returned per hotel, sorted by price."},"RoomTypeGroup":{"properties":{"group_id":{"type":"string","title":"Group Id"},"display_name":{"type":"string","title":"Display Name"},"images":{"items":{"type":"string"},"type":"array","title":"Images"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"cancellation_options":{"items":{"$ref":"#/components/schemas/VariantOption"},"type":"array","title":"Cancellation Options"},"meal_options":{"items":{"$ref":"#/components/schemas/VariantOption"},"type":"array","title":"Meal Options"},"bed_options":{"items":{"$ref":"#/components/schemas/VariantOption"},"type":"array","title":"Bed Options"},"offers":{"items":{"$ref":"#/components/schemas/RoomOffer"},"type":"array","title":"Offers"},"default_quote_id":{"type":"string","title":"Default Quote Id"},"beds":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beds"},"sleeps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sleeps"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"priced_guests":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchGuestConfig"},{"type":"null"}]}},"type":"object","required":["group_id","display_name","default_quote_id"],"title":"RoomTypeGroup","description":"A group of offers for the same physical room type.\n\nThe backend groups offers by room attributes (class, quality, view, etc.)\nand pre-computes variant options. Frontend just renders one card per group\nwith pill selectors for the varying dimensions."},"SavingsMethod":{"type":"string","enum":["card_refund","axel_credit","airline_credit","miles_returned","reduced_payment"],"title":"SavingsMethod","description":"How customer receives savings from repricing."},"SavingsSecured":{"properties":{"savings_method":{"$ref":"#/components/schemas/SavingsMethod"},"amount":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Savings amount"},"miles_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Miles Amount","description":"Miles returned"},"airline_credit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Airline Credit Id","description":"Reference to airline credit record"},"airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Code","description":"IATA airline code"},"airline_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Name","description":"Airline display name"},"expires_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expires At","description":"Credit expiration date"},"loyalty_program":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Program","description":"Loyalty program name"}},"type":"object","required":["savings_method"],"title":"SavingsSecured","description":"Savings captured from a completed reprice."},"SearchFilters":{"properties":{"min_star_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Min Star Rating","description":"Minimum hotel star rating (0-5)"},"max_star_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Max Star Rating","description":"Maximum hotel star rating (0-5)"},"min_review_score":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Min Review Score","description":"Minimum review score (0-10)"},"min_price_per_night":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Minimum price per night"},"max_price_per_night":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Maximum price per night"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities","description":"Required amenities","examples":[["wifi","pool","gym"]]},"refundable_only":{"type":"boolean","title":"Refundable Only","description":"Only return refundable options","default":false},"hotel_chains":{"items":{"type":"string"},"type":"array","title":"Hotel Chains"},"name_search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Search"}},"type":"object","title":"SearchFilters","description":"Quality and price filters for hotel search.\n\nUsed by both pricing and discovery APIs. The discovery API adds\nhotel_chains and name_search on top.","example":{"amenities":["wifi","pool"],"max_price_per_night":{"amount":30000,"currency":"USD"},"max_star_rating":4,"min_price_per_night":{"amount":10000,"currency":"USD"},"min_review_score":7.5,"min_star_rating":3,"refundable_only":false}},"SeatExtraEvidence":{"properties":{"label":{"type":"string","title":"Label"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"},"rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Id"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"}},"additionalProperties":true,"type":"object","required":["label"],"title":"SeatExtraEvidence","description":"Seat or ancillary evidence that may affect equivalence."},"SegmentFareEvidence":{"properties":{"airline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airline Code"},"flight_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flight Number"},"fare_family_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Id"},"fare_family_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Label"},"fare_family_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fare Family Source"},"fare_confidence":{"$ref":"#/components/schemas/FareConfidence","default":"unverified"},"blocker_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocker Reason"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"}},"additionalProperties":true,"type":"object","title":"SegmentFareEvidence","description":"Per-segment fare evidence captured for mixed or partial itineraries."},"SelectedAdFlight":{"properties":{"observation_id":{"type":"string","title":"Observation Id"},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carrier"},"carrier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carrier Code"},"flight_numbers":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flight Numbers"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination"},"departure_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Time"},"arrival_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrival Time"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes"},"stops":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stops"},"price":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price"},"axel_price_flight_only":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Axel Price Flight Only"},"savings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Savings"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"is_pick":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pick"}},"type":"object","required":["observation_id"],"title":"SelectedAdFlight"},"SelectedAdHotel":{"properties":{"hotel_id":{"type":"integer","title":"Hotel Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"price":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price"},"compare_price":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Compare Price"},"savings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Savings"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"is_pick":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pick"}},"type":"object","required":["hotel_id"],"title":"SelectedAdHotel"},"SendOtpRequest":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"captcha_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Token"}},"type":"object","title":"SendOtpRequest","description":"Send OTP - provide email or phone."},"SendOtpResponse":{"properties":{"identity_type":{"type":"string","title":"Identity Type"},"masked_identity":{"type":"string","title":"Masked Identity"},"message":{"type":"string","title":"Message"}},"type":"object","required":["identity_type","masked_identity","message"],"title":"SendOtpResponse","description":"Response after sending OTP."},"SetEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"tracking":{"anyOf":[{"$ref":"#/components/schemas/RegistrationTrackingData"},{"type":"null"}]}},"type":"object","required":["email"],"title":"SetEmailRequest","description":"Request to set the authenticated user's primary email."},"SetEmailResponse":{"properties":{"email":{"type":"string","title":"Email"},"verification_sent":{"type":"boolean","title":"Verification Sent"},"account_state":{"type":"string","enum":["pending_email","complete"],"title":"Account State"},"next_step":{"type":"string","enum":["email","app"],"title":"Next Step"},"account_completed":{"type":"boolean","title":"Account Completed"},"registration_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Event Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["email","verification_sent","account_state","next_step","account_completed","message"],"title":"SetEmailResponse","description":"Response after setting email."},"SetupContext":{"properties":{"pending_savings_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Savings Text"},"pending_savings_total":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"nearest_trip_destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nearest Trip Destination"}},"type":"object","title":"SetupContext"},"SetupStatus":{"properties":{"show":{"type":"boolean","title":"Show"},"flights":{"$ref":"#/components/schemas/FlightSetupStatus"},"hotels":{"$ref":"#/components/schemas/HotelSetupStatus"},"membership":{"$ref":"#/components/schemas/MembershipSetupStatus"},"context":{"$ref":"#/components/schemas/SetupContext"}},"type":"object","required":["show","flights","hotels","membership","context"],"title":"SetupStatus"},"SourceQualityEvidence":{"properties":{"source_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Email Id"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"source_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Source Available"},"source_unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Unavailable Reason"}},"additionalProperties":true,"type":"object","title":"SourceQualityEvidence","description":"Availability and quality of the source used for parsing."},"SparseFlightBookingRequest":{"properties":{"airline_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Airline Code"},"origin_airport":{"type":"string","maxLength":3,"minLength":3,"title":"Origin Airport"},"destination_airport":{"type":"string","maxLength":3,"minLength":3,"title":"Destination Airport"},"departure_date":{"type":"string","format":"date","title":"Departure Date"},"return_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Return Date"},"cash_paid":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cash Paid"},"cash_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Cash Currency"},"num_passengers":{"type":"integer","minimum":1.0,"title":"Num Passengers","default":1},"cabin_class":{"$ref":"#/components/schemas/CabinClass","default":"economy"},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Brain trip document UUID from conversation card"}},"type":"object","required":["origin_airport","destination_airport","departure_date"],"title":"SparseFlightBookingRequest"},"SparseHotelBookingRequest":{"properties":{"hotel_id":{"type":"string","minLength":1,"title":"Hotel Id"},"hotel_name":{"type":"string","maxLength":255,"minLength":1,"title":"Hotel Name"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"cash_paid":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Cash Paid"},"cash_currency":{"type":"string","maxLength":3,"minLength":3,"title":"Cash Currency"},"refundable":{"type":"boolean","title":"Refundable","default":true},"num_guests":{"type":"integer","minimum":1.0,"title":"Num Guests","default":2},"bed_type":{"$ref":"#/components/schemas/BedType","default":"any"},"conv_trip_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conv Trip Id","description":"Brain trip document UUID from conversation card"}},"type":"object","required":["hotel_id","hotel_name","check_in_date","check_out_date","cash_paid","cash_currency"],"title":"SparseHotelBookingRequest"},"StartGmailImportBody":{"properties":{"success_path":{"type":"string","title":"Success Path","description":"Path to redirect to on OAuth success, e.g. /dash?from=gmail&state=success"},"failure_path":{"type":"string","title":"Failure Path","description":"Path to redirect to on OAuth failure, e.g. /dash?from=gmail&state=failure"}},"type":"object","required":["success_path","failure_path"],"title":"StartGmailImportBody","description":"Request body for starting Gmail import (user_id comes from auth)."},"TravelerField":{"type":"string","enum":["first_name","last_name","date_of_birth","gender","postal_code","citizenship","known_traveler_number","loyalty"],"title":"TravelerField","description":"Traveler-profile fields the checkout UI may reference for a session.\n\nThis enum is the field vocabulary only. Whether a field *blocks* checkout\nis decided by which response list carries it: ``required_traveler_fields``\nis the must-collect gate; ``optional_traveler_fields`` is offer-only and\nnever blocks. KTN/loyalty belong to the optional set."},"TravelerResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"first_name":{"type":"string","title":"First Name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"address_line_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line 1"},"address_line_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line 2"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"address_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country"},"known_traveler_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Known Traveler Number"},"redress_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redress Number"},"citizenship":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship"},"citizenship_source":{"anyOf":[{"$ref":"#/components/schemas/CitizenshipSource"},{"type":"null"}]},"citizenship_confirmed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship Confirmed At"},"passports":{"items":{"$ref":"#/components/schemas/Passport"},"type":"array","title":"Passports"},"loyalty_memberships":{"items":{"$ref":"#/components/schemas/LoyaltyMembership"},"type":"array","title":"Loyalty Memberships"},"is_account_holder":{"type":"boolean","title":"Is Account Holder"}},"type":"object","required":["id","name","first_name","last_name","is_account_holder"],"title":"TravelerResponse","description":"Traveler response with combined name."},"TripFactPlace":{"properties":{"code":{"type":"string","maxLength":3,"minLength":3,"title":"Code"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"place_type":{"anyOf":[{"type":"string","enum":["airport","city"]},{"type":"null"}],"title":"Place Type"},"alts":{"items":{"type":"string"},"type":"array","title":"Alts"}},"additionalProperties":false,"type":"object","required":["code"],"title":"TripFactPlace"},"TripFactsDates":{"properties":{"start":{"type":"string","format":"date","title":"Start"},"end":{"type":"string","format":"date","title":"End"},"flex":{"anyOf":[{"$ref":"#/components/schemas/TripFactsPlusMinusFlex"},{"$ref":"#/components/schemas/TripFactsWindowFlex"},{"$ref":"#/components/schemas/TripFactsMonthFlex"},{"type":"null"}],"title":"Flex"}},"additionalProperties":false,"type":"object","required":["start","end"],"title":"TripFactsDates"},"TripFactsHotelIntent":{"properties":{"answer":{"type":"string","enum":["yes","no"],"title":"Answer"},"declared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Declared At"},"source":{"type":"string","enum":["checkout_travelers","conversation"],"title":"Source","default":"checkout_travelers"}},"additionalProperties":false,"type":"object","required":["answer"],"title":"TripFactsHotelIntent","description":"The once-per-trip staying declaration made at flight checkout (FAC-942).\n\n``answer=\"yes\"`` means the traveller said they intend to book a stay for this\ntrip — the flight session is re-priced to the bundle tier and post-booking\nstays wakes are guaranteed. ``answer=\"no\"`` suppresses hotel-offer wakes for\nthe trip. Written by travel's checkout path (``source=\"checkout_travelers\"``)\nor, conversationally, by the LLM ``update_trip_facts`` tool\n(``source=\"conversation\"``)."},"TripFactsMonthFlex":{"properties":{"kind":{"type":"string","const":"month","title":"Kind"},"year":{"type":"integer","maximum":2100.0,"minimum":2000.0,"title":"Year"},"month":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Month"}},"additionalProperties":false,"type":"object","required":["kind","year","month"],"title":"TripFactsMonthFlex"},"TripFactsParty":{"properties":{"adults":{"type":"integer","maximum":9.0,"minimum":0.0,"title":"Adults"},"children":{"type":"integer","maximum":9.0,"minimum":0.0,"title":"Children","default":0},"infants":{"type":"integer","maximum":9.0,"minimum":0.0,"title":"Infants","default":0},"traveler_profile_ids":{"items":{"type":"string"},"type":"array","title":"Traveler Profile Ids"}},"additionalProperties":false,"type":"object","required":["adults"],"title":"TripFactsParty","description":"The durable travelling party written from the checkout roster (FAC-937).\n\nDistinct from ``pax``: ``party`` carries the resolved traveler_profile_ids the\ncustomer picked at checkout, so searches can price the exact same people."},"TripFactsPassengerMix":{"properties":{"adults":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":1.0},{"type":"null"}],"title":"Adults"},"children":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Children"},"infants_in_seat":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Infants In Seat"},"infants_on_lap":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":0.0},{"type":"null"}],"title":"Infants On Lap"}},"additionalProperties":false,"type":"object","title":"TripFactsPassengerMix"},"TripFactsPatch":{"properties":{"route":{"anyOf":[{"$ref":"#/components/schemas/TripFactsRoute"},{"type":"null"}]},"dates":{"anyOf":[{"$ref":"#/components/schemas/TripFactsDates"},{"type":"null"}]},"pax":{"anyOf":[{"$ref":"#/components/schemas/TripFactsPassengerMix"},{"type":"null"}]},"party":{"anyOf":[{"$ref":"#/components/schemas/TripFactsParty"},{"type":"null"}]},"hotel":{"anyOf":[{"$ref":"#/components/schemas/HotelSearchCriteria"},{"type":"null"}]},"hotel_intent":{"anyOf":[{"$ref":"#/components/schemas/TripFactsHotelIntent"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"TripFactsPatch"},"TripFactsPlusMinusFlex":{"properties":{"kind":{"type":"string","const":"plus_minus_days","title":"Kind"},"n":{"type":"integer","minimum":1.0,"title":"N"}},"additionalProperties":false,"type":"object","required":["kind","n"],"title":"TripFactsPlusMinusFlex"},"TripFactsRoute":{"properties":{"origin":{"anyOf":[{"$ref":"#/components/schemas/TripFactPlace"},{"type":"null"}]},"dest":{"anyOf":[{"$ref":"#/components/schemas/TripFactPlace"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"TripFactsRoute"},"TripFactsWindowFlex":{"properties":{"kind":{"type":"string","const":"window","title":"Kind"},"earliest":{"type":"string","format":"date","title":"Earliest"},"latest":{"type":"string","format":"date","title":"Latest"}},"additionalProperties":false,"type":"object","required":["kind","earliest","latest"],"title":"TripFactsWindowFlex"},"TripFactsWorkflowSubmitEntryContext":{"properties":{"kind":{"type":"string","const":"tap_chip_workflow_submit","title":"Kind"},"field":{"type":"string","const":"trip_facts","title":"Field"},"value":{"$ref":"#/components/schemas/TripFactsPatch"}},"additionalProperties":false,"type":"object","required":["kind","field","value"],"title":"TripFactsWorkflowSubmitEntryContext"},"TripSwitchDecisionEntryContext":{"properties":{"kind":{"type":"string","const":"trip_switch_decision","title":"Kind"},"action":{"type":"string","enum":["accept","decline"],"title":"Action"},"target_trip_id":{"type":"string","minLength":1,"title":"Target Trip Id"},"target_trip_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Trip Name"},"offer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Offer Id"}},"additionalProperties":false,"type":"object","required":["kind","action","target_trip_id"],"title":"TripSwitchDecisionEntryContext"},"UpdateDeferredPaymentMethodRequest":{"properties":{"payment_method_id":{"type":"string","minLength":1,"title":"Payment Method Id","description":"Stripe payment method ID to use for the scheduled deferred charge."}},"type":"object","required":["payment_method_id"],"title":"UpdateDeferredPaymentMethodRequest"},"UpdateDeferredPaymentMethodResponse":{"properties":{"hotel_purchase_id":{"type":"string","format":"uuid","title":"Hotel Purchase Id"},"state":{"type":"string","title":"State"},"payment_method_id":{"type":"string","title":"Payment Method Id"},"card_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last4"},"charge_attempts":{"type":"integer","title":"Charge Attempts"},"planned_charge_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Charge Date"}},"type":"object","required":["hotel_purchase_id","state","payment_method_id","charge_attempts"],"title":"UpdateDeferredPaymentMethodResponse"},"UpdateMeRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"auto_reprice_flights":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Reprice Flights"},"auto_reprice_hotels":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Reprice Hotels"},"action_threshold_usd":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Action Threshold Usd"},"quiet_hours_start":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Quiet Hours Start"},"quiet_hours_end":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Quiet Hours End"},"sms_opted_in":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms Opted In"},"sms_opted_out":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms Opted Out"},"display_currency_preference":{"anyOf":[{"type":"string","enum":["USD","CAD"]},{"type":"null"}],"title":"Display Currency Preference"}},"type":"object","title":"UpdateMeRequest","description":"Request to update current user profile and settings.\n\nNote: email/phone changes require identity verification via /users/{id}/identity endpoint."},"UpdateTravelerRequest":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"address_line_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line 1"},"address_line_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line 2"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"address_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country"},"known_traveler_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Known Traveler Number"},"redress_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redress Number"},"citizenship":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship"},"passports":{"anyOf":[{"items":{"$ref":"#/components/schemas/Passport"},"type":"array"},{"type":"null"}],"title":"Passports"},"loyalty_memberships":{"anyOf":[{"items":{"$ref":"#/components/schemas/LoyaltyMembership"},"type":"array"},{"type":"null"}],"title":"Loyalty Memberships"}},"type":"object","title":"UpdateTravelerRequest","description":"Request to update a traveler."},"UpgradeMembershipRequest":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"plan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Id"},"quote_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Quote Request Id"},"checkout_attribution":{"anyOf":[{"$ref":"#/components/schemas/CheckoutAttributionData"},{"type":"null"}]}},"type":"object","title":"UpgradeMembershipRequest","description":"Request payload accepted by membership checkout endpoint."},"UpgradeMembershipResponse":{"properties":{"client_secret":{"type":"string","title":"Client Secret"},"subscription_id":{"type":"string","title":"Subscription Id"}},"type":"object","required":["client_secret","subscription_id"],"title":"UpgradeMembershipResponse","description":"Response with Stripe payment details."},"UserPromoCodeResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"benefit_config":{"$ref":"#/components/schemas/PromoCodeBenefitConfig"},"assigned_at":{"type":"string","format":"date-time","title":"Assigned At"}},"type":"object","required":["id","code","benefit_config","assigned_at"],"title":"UserPromoCodeResponse","description":"Promo code assigned to a user."},"UserReferralsResponse":{"properties":{"referred_booked_count":{"type":"integer","title":"Referred Booked Count"},"total_credits_earned_cents":{"type":"integer","title":"Total Credits Earned Cents"},"total_credits_currency":{"type":"string","title":"Total Credits Currency"}},"type":"object","required":["referred_booked_count","total_credits_earned_cents","total_credits_currency"],"title":"UserReferralsResponse","description":"Referral summary for a referrer: counts only, never names.\n\nreferred_booked_count = friends whose first paid booking granted this\nuser a referral reward (joining alone is not counted)."},"ValidatePromoCodeResponse":{"properties":{"exists":{"type":"boolean","title":"Exists"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"benefit_config":{"anyOf":[{"$ref":"#/components/schemas/PromoCodeBenefitConfig"},{"type":"null"}]},"message":{"type":"string","title":"Message"}},"type":"object","required":["exists","message"],"title":"ValidatePromoCodeResponse","description":"Response from checking a signup promo code."},"ValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"referrer_first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer First Name"},"referrer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Referrer Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["valid","message"],"title":"ValidateResponse","description":"Response from validating a referral code."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantOption":{"properties":{"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value"},"price_diff":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"type":"object","required":["label","value"],"title":"VariantOption","description":"A selectable option within a room type group (e.g. meal plan, cancellation).\n\nFrontend renders these as pill buttons. The price_diff shows the\ncost difference relative to the cheapest option in the group."},"VerifierDecision":{"type":"string","enum":["accepted_exact","accepted_likely","downgraded","rejected","ambiguous","source_unavailable"],"title":"VerifierDecision","description":"How deterministic verification handled an LLM claim."},"VerifyOtpRequest":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"otp_code":{"type":"string","title":"Otp Code"}},"type":"object","required":["otp_code"],"title":"VerifyOtpRequest","description":"Verify OTP code."},"VerifyOtpResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"is_new_user":{"type":"boolean","title":"Is New User","default":false},"account_state":{"anyOf":[{"type":"string","enum":["pending_email","complete"]},{"type":"null"}],"title":"Account State"},"next_step":{"anyOf":[{"type":"string","enum":["email","app"]},{"type":"null"}],"title":"Next Step"}},"type":"object","required":["success"],"title":"VerifyOtpResponse","description":"Response after OTP verification."},"Viewport":{"properties":{"sw":{"$ref":"#/components/schemas/LatLng"},"ne":{"$ref":"#/components/schemas/LatLng"}},"type":"object","required":["sw","ne"],"title":"Viewport","description":"Map viewport defined by SW and NE corners of the visible area.\n\nSent by the client whenever the user pans or zooms the map."},"WakeLinkHotelTarget":{"properties":{"type":{"type":"string","const":"hotel","title":"Type"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},"type":"object","required":["type"],"title":"WakeLinkHotelTarget","description":"Typed target metadata for hotel wake links."},"WakeLinkResolveResponse":{"anyOf":[{"$ref":"#/components/schemas/FlightShareWakeLinkResolveResponse"},{"$ref":"#/components/schemas/FlightWakeLinkResolveResponse"},{"$ref":"#/components/schemas/HotelWakeLinkResolveResponse"}]},"api__ad_deals__TripResponse":{"properties":{"response":{"type":"string","title":"Response"},"trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip Id"},"session_id":{"type":"string","title":"Session Id"},"navigate_to_trip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate To Trip"},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats"}},"type":"object","required":["response","trip_id","session_id"],"title":"TripResponse"},"api__conversational__TripResponse":{"properties":{"response":{"type":"string","title":"Response"},"trip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trip Id"},"session_id":{"type":"string","title":"Session Id"},"navigate_to_trip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate To Trip"},"trip_facts":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trip Facts"},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats"}},"type":"object","required":["response","trip_id","session_id"],"title":"TripResponse"},"api__hotel_purchases__GuestRoom":{"properties":{"traveler_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Traveler Id","description":"Saved traveler profile ID. Gateway resolves to name."},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","description":"Guest first name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name","description":"Guest last name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Guest email"},"adults":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"integer"},{"type":"null"}],"title":"Adults","description":"Named adult guests or count. ETG-ready format."},"children":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"integer"},{"type":"null"}],"title":"Children","description":"Named child guests or count."}},"type":"object","title":"GuestRoom","description":"Guest details for a room. The FE may send one of three shapes:\n\n1. Saved traveler:  {\"traveler_id\": \"uuid\"}\n   → Gateway resolves to first_name/last_name from travel service.\n2. Manual entry:    {\"first_name\": \"...\", \"last_name\": \"...\", \"email\": \"...\"}\n3. Structured room: {\"adults\": [...], \"children\": [...]}\n   → Already in ETG-ready format, passed through as-is."},"schemas__content__hotel_search__GuestRoom":{"properties":{"adults":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Adults","description":"Number of adults"},"children":{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array","title":"Children","description":"List of children with ages","examples":[[{"age":5},{"age":8}]]}},"type":"object","required":["adults"],"title":"GuestRoom","description":"Guest configuration for a single room.","example":{"adults":2,"children":[{"age":5}]}}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}