{"openapi":"3.1.0","info":{"title":"Agentic Airways API","version":"1.0.0","description":"Programmatic access to every operation available on the Agentic Airways website — flight search (nonstop + connecting), booking, reservation management, check-in, seats, baggage, upgrades, loyalty, and operations. All responses use the { success, summary, data } Envelope; `summary` is written for an AI agent. Authenticate with the `x-api-key` header."},"servers":[{"url":"https://0.0.0.0:3000"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"Envelope":{"type":"object","description":"Standard wrapper on every response. On success, `data` holds the typed payload documented per endpoint; on failure, `error` is present instead.","properties":{"success":{"type":"boolean","description":"true on success, false on error."},"summary":{"type":"string","description":"Plain-English description of the result, written for an AI agent (present on success)."},"data":{"type":"object","description":"The typed payload (present on success). Shape documented per endpoint."},"error":{"$ref":"#/components/schemas/ApiError","description":"Error detail (present on failure)."}},"required":["success"]},"ApiError":{"type":"object","description":"Error payload.","properties":{"code":{"type":"string","description":"Machine code: NOT_FOUND, INVALID_INPUT, NOT_ALLOWED, CONFLICT, UNAUTHORIZED, or INTERNAL."},"message":{"type":"string","description":"Human-readable explanation."},"details":{"type":"object","description":"Optional structured context (e.g. flightId)."}},"required":["code","message"]},"TimeInfo":{"type":"object","description":"A timestamp rendered in the relevant airport's local timezone.","properties":{"iso":{"type":"string","description":"ISO 8601 UTC instant."},"time":{"type":"string","description":"Local clock time, e.g. \"3:15 PM\"."},"date":{"type":"string","description":"Local date, e.g. \"Mon, Jul 20\"."},"timezone":{"type":"string","description":"IANA timezone of the airport."}},"required":["iso","time","date","timezone"]},"Airport":{"type":"object","description":"An airport in the network.","properties":{"code":{"type":"string","description":"3-letter IATA-style code (e.g. SEA)."},"name":{"type":"string","description":"Full airport name."},"city":{"type":"string","description":"City served."},"country":{"type":"string","description":"Country."},"timezone":{"type":"string","description":"IANA timezone."}},"required":["code","name","city","country","timezone"]},"Disruption":{"type":"object","description":"Why a flight is delayed or cancelled.","properties":{"category":{"type":"string","description":"crew | maintenance | aircraft | airline_operations | weather | air_traffic_control | security | airport_operations | extraordinary."},"categoryLabel":{"type":"string","description":"Display label for the category."},"controllable":{"type":"boolean","description":"true if within the airline's control (crew/maintenance/aircraft/ops)."},"responsibility":{"type":"string","description":"\"airline-controlled\" or \"outside airline control\"."},"reason":{"type":"string","description":"Customer-facing explanation."}},"required":["category","categoryLabel","controllable","responsibility","reason"]},"Fare":{"type":"object","description":"A purchasable cabin fare on a single flight.","properties":{"cabin":{"type":"string","description":"economy | premium | business | first."},"cabinLabel":{"type":"string","description":"Brand label, e.g. \"Main Cabin\", \"Agentic Business\"."},"price":{"type":"number","description":"Fare price (numeric)."},"priceFormatted":{"type":"string","description":"Formatted price, e.g. \"$329\"."},"currency":{"type":"string","description":"ISO currency code (USD)."},"seatsAvailable":{"type":"integer","description":"Seats remaining in this cabin."},"available":{"type":"boolean","description":"true if seatsAvailable > 0."},"refundable":{"type":"boolean","description":"Whether the fare is refundable on cancellation."},"changeable":{"type":"boolean","description":"Whether the fare can be changed."},"includedBags":{"type":"integer","description":"Checked bags included in the fare."},"fareCode":{"type":"string","description":"Internal fare code."}},"required":["cabin","cabinLabel","price","priceFormatted","currency","seatsAvailable","available","refundable","changeable","includedBags","fareCode"]},"Flight":{"type":"object","description":"A single scheduled flight with fares and live operational status.","properties":{"id":{"type":"string","description":"Flight instance id, e.g. \"AG145-2026-08-20\". Use when booking."},"flightNumber":{"type":"string","description":"Flight number, e.g. AG145."},"origin":{"type":"string","description":"Origin airport code."},"originCity":{"type":"string","description":"Origin city."},"destination":{"type":"string","description":"Destination airport code."},"destinationCity":{"type":"string","description":"Destination city."},"departure":{"$ref":"#/components/schemas/TimeInfo","description":"Scheduled departure."},"arrival":{"$ref":"#/components/schemas/TimeInfo","description":"Scheduled arrival."},"durationMinutes":{"type":"integer","description":"Scheduled duration in minutes."},"duration":{"type":"string","description":"Duration formatted, e.g. \"5h 15m\"."},"distanceMiles":{"type":"integer","description":"Approximate great-circle distance (drives lounge/award banding)."},"isInternational":{"type":"boolean","description":"true if origin and destination are in different countries."},"aircraft":{"type":"string","description":"Aircraft type."},"status":{"type":"string","description":"scheduled | on_time | delayed | boarding | departed | arrived | cancelled."},"statusLabel":{"type":"string","description":"Display label for status."},"onTime":{"type":"boolean","description":"true if on_time or scheduled."},"delayed":{"type":"boolean","description":"true if delayed."},"cancelled":{"type":"boolean","description":"true if cancelled."},"delayMinutes":{"type":"integer","description":"Delay length in minutes (0 if none)."},"estimatedDeparture":{"$ref":"#/components/schemas/TimeInfo","description":"Revised departure when delayed, else null."},"estimatedArrival":{"$ref":"#/components/schemas/TimeInfo","description":"Revised arrival when delayed, else null."},"disruption":{"$ref":"#/components/schemas/Disruption","description":"Delay/cancellation reason, else null."},"gate":{"type":"string","description":"Departure gate."},"terminal":{"type":"string","description":"Departure terminal."},"fares":{"type":"array","items":{"$ref":"#/components/schemas/Fare"},"description":"Available cabins and prices."},"lowestFare":{"type":"number","description":"Cheapest available fare, or null."},"summary":{"type":"string","description":"Plain-English summary of the flight."}},"required":["id","flightNumber","origin","originCity","destination","destinationCity","departure","arrival","durationMinutes","duration","distanceMiles","isInternational","aircraft","status","statusLabel","onTime","delayed","cancelled","delayMinutes","fares","summary"]},"ItineraryLeg":{"type":"object","description":"One flight within an itinerary.","properties":{"id":{"type":"string","description":"Flight instance id."},"flightNumber":{"type":"string","description":"Flight number."},"origin":{"type":"string","description":"Origin code."},"originCity":{"type":"string","description":"Origin city."},"destination":{"type":"string","description":"Destination code."},"destinationCity":{"type":"string","description":"Destination city."},"departure":{"$ref":"#/components/schemas/TimeInfo","description":"Departure."},"arrival":{"$ref":"#/components/schemas/TimeInfo","description":"Arrival."},"cabinsOffered":{"type":"array","items":{"type":"string"},"description":"Cabins offered on this leg."},"status":{"type":"string","description":"Operational status."},"statusLabel":{"type":"string","description":"Status label."},"aircraft":{"type":"string","description":"Aircraft type."}},"required":["id","flightNumber","origin","originCity","destination","destinationCity","departure","arrival","cabinsOffered","status","statusLabel","aircraft"]},"ItineraryFare":{"type":"object","description":"Combined fare for a cabin across all legs of the itinerary.","properties":{"cabin":{"type":"string","description":"Cabin code."},"cabinLabel":{"type":"string","description":"Cabin label."},"available":{"type":"boolean","description":"true if the cabin has seats on every leg."},"price":{"type":"number","description":"Sum of the cabin fare across legs."},"priceFormatted":{"type":"string","description":"Formatted combined price."}},"required":["cabin","cabinLabel","available","price","priceFormatted"]},"Itinerary":{"type":"object","description":"A nonstop or connecting journey between two cities. Connecting itineraries route through a hub (LHR/JFK/LAX) with a ≥2-hour connection.","properties":{"id":{"type":"string","description":"One or more flight ids joined by \"+\" (used when booking a connection)."},"type":{"type":"string","description":"\"direct\" or \"connecting\"."},"stops":{"type":"integer","description":"Number of stops (0 for direct, 1 for connecting)."},"connectVia":{"type":"string","description":"Hub airport code for connections, else null."},"connectViaCity":{"type":"string","description":"Hub city, else null."},"layover":{"type":"string","description":"Layover duration formatted, else null."},"origin":{"type":"string","description":"Journey origin code."},"originCity":{"type":"string","description":"Origin city."},"destination":{"type":"string","description":"Journey destination code."},"destinationCity":{"type":"string","description":"Destination city."},"departure":{"$ref":"#/components/schemas/TimeInfo","description":"First leg departure."},"arrival":{"$ref":"#/components/schemas/TimeInfo","description":"Last leg arrival."},"totalDuration":{"type":"string","description":"Total journey time formatted."},"totalDurationMinutes":{"type":"integer","description":"Total journey time in minutes."},"legs":{"type":"array","items":{"$ref":"#/components/schemas/ItineraryLeg"},"description":"The flights in order."},"fares":{"type":"array","items":{"$ref":"#/components/schemas/ItineraryFare"},"description":"Combined per-cabin fares (only cabins offered on all legs)."},"lowestFare":{"type":"number","description":"Cheapest available combined fare, or null."},"summary":{"type":"string","description":"Plain-English summary of the itinerary."}},"required":["id","type","stops","origin","originCity","destination","destinationCity","departure","arrival","totalDuration","totalDurationMinutes","legs","fares","summary"]},"Passenger":{"type":"object","description":"A passenger on a reservation.","properties":{"id":{"type":"string","description":"6-char passenger reference (used for seats/baggage)."},"name":{"type":"string","description":"Full name."},"firstName":{"type":"string","description":"First name."},"lastName":{"type":"string","description":"Last name."},"loyaltyId":{"type":"string","description":"Meridian Club member id, or null."}},"required":["id","name","firstName","lastName"]},"SeatAssignment":{"type":"object","description":"A passenger's seat on a segment.","properties":{"passengerId":{"type":"string","description":"Passenger reference."},"passengerName":{"type":"string","description":"Passenger name."},"seat":{"type":"string","description":"Seat number (e.g. 14C), or null if unassigned."}},"required":["passengerId","passengerName"]},"Baggage":{"type":"object","description":"A passenger's checked-bag count on a segment.","properties":{"passengerId":{"type":"string","description":"Passenger reference."},"passengerName":{"type":"string","description":"Passenger name."},"checkedBags":{"type":"integer","description":"Number of checked bags."}},"required":["passengerId","passengerName","checkedBags"]},"Segment":{"type":"object","description":"One flight within a reservation, with per-passenger seats and bags plus live status.","properties":{"id":{"type":"string","description":"Segment id (used for change/seats/checkin/baggage/upgrade)."},"flightId":{"type":"string","description":"Underlying flight id."},"flightNumber":{"type":"string","description":"Flight number."},"origin":{"type":"string","description":"Origin code."},"originCity":{"type":"string","description":"Origin city."},"destination":{"type":"string","description":"Destination code."},"destinationCity":{"type":"string","description":"Destination city."},"departure":{"$ref":"#/components/schemas/TimeInfo","description":"Departure."},"arrival":{"$ref":"#/components/schemas/TimeInfo","description":"Arrival."},"cabin":{"type":"string","description":"Booked cabin."},"cabinLabel":{"type":"string","description":"Cabin label."},"fareCode":{"type":"string","description":"Fare code."},"isInternational":{"type":"boolean","description":"true if the segment crosses a country border."},"status":{"type":"string","description":"Live flight status."},"statusLabel":{"type":"string","description":"Status label."},"delayMinutes":{"type":"integer","description":"Delay minutes if delayed."},"estimatedDeparture":{"$ref":"#/components/schemas/TimeInfo","description":"Revised departure if delayed, else null."},"disruption":{"$ref":"#/components/schemas/Disruption","description":"Disruption reason if any, else null."},"seats":{"type":"array","items":{"$ref":"#/components/schemas/SeatAssignment"},"description":"Seat per passenger."},"baggage":{"type":"array","items":{"$ref":"#/components/schemas/Baggage"},"description":"Bags per passenger."},"hoursToDeparture":{"type":"number","description":"Hours until departure."},"departed":{"type":"boolean","description":"true if already departed."},"cancelled":{"type":"boolean","description":"true if the flight is cancelled."},"checkedIn":{"type":"boolean","description":"true if checked in."},"hasUnassignedSeats":{"type":"boolean","description":"true if any passenger lacks a seat."},"unassignedSeatCount":{"type":"integer","description":"Count of unassigned seats."},"checkInWindow":{"type":"string","description":"before_open | open | closed | departed (check-in opens 24h before, closes 60m before)."},"checkInClosesAt":{"type":"string","description":"ISO instant check-in closes (60m before departure)."},"bagDropDeadline":{"type":"string","description":"ISO bag-drop cutoff (40m domestic / 60m international)."},"canCheckIn":{"type":"boolean","description":"true if within the check-in window (open) and not yet checked in."},"canChangeFlight":{"type":"boolean","description":"true if the segment can be changed."},"canSelectSeats":{"type":"boolean","description":"true if seats can be selected."}},"required":["id","flightId","flightNumber","origin","originCity","destination","destinationCity","departure","arrival","cabin","cabinLabel","fareCode","isInternational","status","statusLabel","delayMinutes","seats","baggage","hoursToDeparture","departed","cancelled","checkedIn","hasUnassignedSeats","unassignedSeatCount","checkInWindow","checkInClosesAt","bagDropDeadline","canCheckIn","canChangeFlight","canSelectSeats"]},"Reservation":{"type":"object","description":"A booking (PNR) with passengers, segments, and derived action flags.","properties":{"pnr":{"type":"string","description":"6-char confirmation code."},"status":{"type":"string","description":"confirmed | cancelled | completed."},"tripType":{"type":"string","description":"one-way | round-trip | multi-city."},"passengers":{"type":"array","items":{"$ref":"#/components/schemas/Passenger"},"description":"Passengers on the booking."},"contactEmail":{"type":"string","description":"Contact email."},"totalPaid":{"type":"number","description":"Total paid (numeric)."},"totalPaidFormatted":{"type":"string","description":"Total paid formatted."},"currency":{"type":"string","description":"Currency code."},"loyaltyId":{"type":"string","description":"Primary member id, or null."},"segments":{"type":"array","items":{"$ref":"#/components/schemas/Segment"},"description":"Flights on the booking."},"canCheckIn":{"type":"boolean","description":"true if any segment can be checked in now."},"canChange":{"type":"boolean","description":"true if the booking can be changed."},"canCancel":{"type":"boolean","description":"true if the booking can be cancelled."},"fullyCheckedIn":{"type":"boolean","description":"true if all segments are checked in or departed."},"hasUnassignedSeats":{"type":"boolean","description":"true if any upcoming segment has unassigned seats."},"summary":{"type":"string","description":"Plain-English summary of the reservation."}},"required":["pnr","status","tripType","passengers","contactEmail","totalPaid","totalPaidFormatted","currency","segments","canCheckIn","canChange","canCancel","fullyCheckedIn","hasUnassignedSeats","summary"]},"BookingPreviewLeg":{"type":"object","description":"One flight within a booking preview, with its per-passenger fare.","properties":{"flightId":{"type":"string","description":"Flight instance id."},"flightNumber":{"type":"string","description":"Flight number."},"origin":{"type":"string","description":"Origin airport code."},"destination":{"type":"string","description":"Destination airport code."},"cabin":{"type":"string","description":"Cabin priced on this leg."},"cabinLabel":{"type":"string","description":"Brand cabin label."},"farePerPassengerUsd":{"type":"number","description":"One passenger's fare on this leg."}},"required":["flightId","flightNumber","origin","destination","cabin","cabinLabel","farePerPassengerUsd"]},"BookingPreviewPassenger":{"type":"object","description":"A passenger's total fare across all legs in a booking preview.","properties":{"name":{"type":"string","description":"Passenger full name."},"fareUsd":{"type":"number","description":"This passenger's fare across all segments."}},"required":["name","fareUsd"]},"BookingPreview":{"type":"object","description":"A fully priced quote for a NEW booking that is NOT created — nothing is booked, no inventory is taken, and travel credits are quoted but NOT redeemed. The quoted total can never differ from what booking will charge.","properties":{"tripType":{"type":"string","description":"one-way | round-trip | multi-city."},"currency":{"type":"string","description":"Currency code (USD)."},"passengerCount":{"type":"integer","description":"Number of passengers priced."},"legs":{"type":"array","items":{"$ref":"#/components/schemas/BookingPreviewLeg"},"description":"Per-leg fares in order."},"perPassenger":{"type":"array","items":{"$ref":"#/components/schemas/BookingPreviewPassenger"},"description":"Per-passenger fare totals."},"fareTotal":{"type":"number","description":"Fare subtotal across all passengers, before any credit."},"taxesFees":{"type":"number","description":"Taxes and fees (demo fares are all-inclusive → 0)."},"subtotal":{"type":"number","description":"fareTotal + taxesFees."},"creditApplied":{"type":"number","description":"Travel credit that WOULD apply (quoted, not redeemed)."},"appliedCreditCodes":{"type":"array","items":{"type":"string"},"description":"Credit certificate codes that would be used."},"totalDueUsd":{"type":"number","description":"Amount due to card after credit."},"summary":{"type":"string","description":"Plain-English quote (states nothing was booked)."}},"required":["tripType","currency","passengerCount","legs","perPassenger","fareTotal","taxesFees","subtotal","creditApplied","appliedCreditCodes","totalDueUsd","summary"]},"Seat":{"type":"object","description":"A physical seat on an aircraft.","properties":{"number":{"type":"string","description":"Seat number, e.g. 14C."},"row":{"type":"integer","description":"Row number."},"column":{"type":"string","description":"Column letter."},"cabin":{"type":"string","description":"Cabin the seat is in."},"type":{"type":"string","description":"window | middle | aisle."},"available":{"type":"boolean","description":"true if the seat is free."},"extraLegroom":{"type":"boolean","description":"true for extra-legroom seats."},"exitRow":{"type":"boolean","description":"true for exit-row seats."},"price":{"type":"number","description":"Seat-selection fee."},"seatTier":{"type":"string","description":"standard | preferred (Main Cabin Preferred; fee waived for elites)."}},"required":["number","row","column","cabin","type","available","extraLegroom","exitRow","price"]},"SeatMapCabin":{"type":"object","description":"Availability summary for one cabin.","properties":{"cabin":{"type":"string","description":"Cabin code."},"cabinLabel":{"type":"string","description":"Cabin label."},"totalSeats":{"type":"integer","description":"Total seats in the cabin."},"availableSeats":{"type":"integer","description":"Available seats."},"sampleAvailable":{"type":"array","items":{"type":"string"},"description":"Up to 12 example available seat numbers."}},"required":["cabin","cabinLabel","totalSeats","availableSeats","sampleAvailable"]},"SeatMap":{"type":"object","description":"The full seat map for a flight with live availability.","properties":{"flightId":{"type":"string","description":"Flight id."},"aircraft":{"type":"string","description":"Aircraft type."},"cabins":{"type":"array","items":{"$ref":"#/components/schemas/SeatMapCabin"},"description":"Per-cabin availability summary."},"seats":{"type":"array","items":{"$ref":"#/components/schemas/Seat"},"description":"Every seat with availability."},"summary":{"type":"string","description":"Plain-English availability summary."}},"required":["flightId","aircraft","cabins","seats","summary"]},"Loyalty":{"type":"object","description":"A Meridian Club loyalty account.","properties":{"memberId":{"type":"string","description":"Member number, e.g. AG7781234."},"name":{"type":"string","description":"Member full name."},"firstName":{"type":"string","description":"First name."},"lastName":{"type":"string","description":"Last name."},"email":{"type":"string","description":"Account email."},"phone":{"type":"string","description":"Contact phone, or null."},"dateOfBirth":{"type":"string","description":"Date of birth (YYYY-MM-DD), or null."},"tier":{"type":"string","description":"blue | silver | gold | platinum."},"tierLabel":{"type":"string","description":"Tier label, e.g. \"Meridian Gold\"."},"miles":{"type":"integer","description":"Miles balance."},"milesFormatted":{"type":"string","description":"Miles balance formatted."},"milesToNextTier":{"type":"integer","description":"Miles to the next tier (0 at top tier)."},"benefits":{"$ref":"#/components/schemas/TierBenefits","description":"The member's tier entitlements (bags, upgrades, seating)."},"summary":{"type":"string","description":"Plain-English account summary."}},"required":["memberId","name","firstName","lastName","email","tier","tierLabel","miles","milesFormatted","milesToNextTier","benefits","summary"]},"TierBenefits":{"type":"object","description":"The concrete entitlements a Meridian Club tier confers (single source of truth for benefit quoting).","properties":{"tier":{"type":"string","description":"blue | silver | gold | platinum."},"tierLabel":{"type":"string","description":"Tier label, e.g. \"Meridian Gold\"."},"freeCheckedBags":{"type":"integer","description":"Free checked bags (Blue 0, Silver 1, Gold 2, Platinum 3)."},"complimentaryUpgradeCabins":{"type":"array","items":{"type":"string"},"description":"Cabins eligible for a complimentary upgrade."},"complimentaryUpgradeCabinLabels":{"type":"array","items":{"type":"string"},"description":"Human labels for those cabins."},"upgradeClearanceHoursBeforeDeparture":{"type":"integer","description":"When complimentary upgrades start clearing (Silver 48, Gold 72, Platinum 120)."},"complimentaryPreferredSeat":{"type":"boolean","description":"true if Main Cabin preferred seats are complimentary."},"summary":{"type":"string","description":"Plain-English benefits summary."}},"required":["tier","tierLabel","freeCheckedBags","complimentaryUpgradeCabins","complimentaryUpgradeCabinLabels","upgradeClearanceHoursBeforeDeparture","complimentaryPreferredSeat","summary"]},"BoardingPass":{"type":"object","description":"An issued boarding pass.","properties":{"pnr":{"type":"string","description":"Confirmation code."},"passengerName":{"type":"string","description":"Passenger name."},"flightNumber":{"type":"string","description":"Flight number."},"origin":{"type":"string","description":"Origin code."},"destination":{"type":"string","description":"Destination code."},"departureTime":{"type":"string","description":"ISO departure instant."},"arrivalTime":{"type":"string","description":"ISO arrival instant."},"departureLocal":{"type":"string","description":"Local departure time."},"departureDate":{"type":"string","description":"Local departure date."},"cabin":{"type":"string","description":"Cabin."},"seat":{"type":"string","description":"Seat number."},"boardingGroup":{"type":"string","description":"Tier-aware boarding group: preboard | priority | A | B | D | E."},"boardingGroupBasis":{"type":"string","description":"Plain-English reason for the boarding group (e.g. \"Meridian Platinum → Priority Boarding\")."},"gate":{"type":"string","description":"Gate."},"terminal":{"type":"string","description":"Terminal."},"sequence":{"type":"integer","description":"Boarding sequence number."},"barcode":{"type":"string","description":"Boarding-pass barcode string."},"checkInClosesAt":{"type":"string","description":"ISO instant check-in closed (60m before departure)."},"bagDropDeadline":{"type":"string","description":"ISO bag-drop cutoff (40m domestic / 60m international)."},"boardingDoorClosesAt":{"type":"string","description":"ISO instant the boarding door closes (15m before departure)."},"summary":{"type":"string","description":"Plain-English boarding-pass summary."}},"required":["pnr","passengerName","flightNumber","origin","destination","departureTime","arrivalTime","departureLocal","departureDate","cabin","seat","boardingGroup","boardingGroupBasis","sequence","barcode","checkInClosesAt","bagDropDeadline","boardingDoorClosesAt","summary"]},"OpsCategoryCount":{"type":"object","description":"Disruption count for one cause category.","properties":{"category":{"type":"string","description":"Disruption category."},"count":{"type":"integer","description":"Number of disrupted flights in this category."},"controllable":{"type":"boolean","description":"true if airline-controlled."}},"required":["category","count","controllable"]},"OpsFlightRow":{"type":"object","description":"A delayed or cancelled flight in the operations window.","properties":{"id":{"type":"string","description":"Flight id."},"flightNumber":{"type":"string","description":"Flight number."},"origin":{"type":"string","description":"Origin code."},"destination":{"type":"string","description":"Destination code."},"departureTime":{"type":"string","description":"ISO departure instant."},"status":{"type":"string","description":"delayed | cancelled."},"delayMinutes":{"type":"integer","description":"Delay minutes (0 for cancellations)."},"category":{"type":"string","description":"Disruption category, or null."},"controllable":{"type":"boolean","description":"Whether airline-controlled, or null."},"reason":{"type":"string","description":"Customer-facing reason, or null."}},"required":["id","flightNumber","origin","destination","departureTime","status","delayMinutes"]},"OperationsSnapshot":{"type":"object","description":"Live operational health across flights departing within the window.","properties":{"windowDays":{"type":"integer","description":"Days ahead included."},"totalFlights":{"type":"integer","description":"Departures in the window."},"byStatus":{"type":"object","description":"Map of status -> count."},"onTimePerformance":{"type":"number","description":"On-time percentage (0-100)."},"disrupted":{"type":"integer","description":"Flights with a disruption."},"controllable":{"type":"integer","description":"Airline-controlled disruptions."},"uncontrollable":{"type":"integer","description":"Disruptions outside airline control."},"byCategory":{"type":"array","items":{"$ref":"#/components/schemas/OpsCategoryCount"},"description":"Disruption counts by cause."},"disruptions":{"type":"array","items":{"$ref":"#/components/schemas/OpsFlightRow"},"description":"Delayed/cancelled flights, soonest first."}},"required":["windowDays","totalFlights","byStatus","onTimePerformance","disrupted","controllable","uncontrollable","byCategory","disruptions"]},"ChangeResult":{"type":"object","description":"Result of changing a segment.","properties":{"reservation":{"$ref":"#/components/schemas/Reservation","description":"Updated reservation."},"fareDifference":{"type":"number","description":"Amount actually charged (positive) or credited (negative); 0 when waived."},"waivedFareDifference":{"type":"number","description":"Fare difference waived due to an airline disruption (0 otherwise)."},"reason":{"type":"string","description":"voluntary | airline_disruption (a protected rebooking waives the fare difference)."},"currency":{"type":"string","description":"Currency code."}},"required":["reservation","fareDifference","waivedFareDifference","reason","currency"]},"ChangePreview":{"type":"object","description":"Read-only quote of a flight change (no commit) — the fare difference and reason before you change.","properties":{"segmentId":{"type":"string","description":"Segment that would change."},"fromCabin":{"type":"string","description":"Current cabin."},"toCabin":{"type":"string","description":"Cabin after the change."},"newFlightId":{"type":"string","description":"Target flight id."},"newFlightNumber":{"type":"string","description":"Target flight number."},"fareDifference":{"type":"number","description":"Amount that would be charged (0 when waived)."},"waivedFareDifference":{"type":"number","description":"Amount waived due to an airline disruption."},"reason":{"type":"string","description":"voluntary | airline_disruption."},"currency":{"type":"string","description":"Currency code."},"summary":{"type":"string","description":"Plain-English quote."}},"required":["segmentId","fromCabin","toCabin","newFlightId","newFlightNumber","fareDifference","waivedFareDifference","reason","currency","summary"]},"CancelPreview":{"type":"object","description":"Read-only quote of a cancellation (no commit) — refund vs. travel credit and reason before you cancel.","properties":{"refundAmount":{"type":"number","description":"Amount that would be refunded to original payment."},"travelCredit":{"type":"number","description":"Amount that would be issued as travel credit."},"refundable":{"type":"boolean","description":"true if any cash refund would be due."},"reason":{"type":"string","description":"within_24h_of_booking | airline_disruption | refundable_fare | non_refundable_credit | mixed."},"within24HourGracePeriod":{"type":"boolean","description":"true if within 24h of booking (full refund)."},"currency":{"type":"string","description":"Currency code."},"summary":{"type":"string","description":"Plain-English quote."}},"required":["refundAmount","travelCredit","refundable","reason","within24HourGracePeriod","currency","summary"]},"CancelResult":{"type":"object","description":"Result of cancelling a reservation.","properties":{"reservation":{"$ref":"#/components/schemas/Reservation","description":"Cancelled reservation."},"refundAmount":{"type":"number","description":"Refunded to original payment."},"travelCredit":{"type":"number","description":"Issued as travel credit (non-refundable fares outside grace/disruption)."},"refundable":{"type":"boolean","description":"true if any refund was due."},"reason":{"type":"string","description":"within_24h_of_booking | airline_disruption | refundable_fare | non_refundable_credit | mixed."},"within24HourGracePeriod":{"type":"boolean","description":"true if cancelled within 24h of booking (full refund)."},"travelCreditCode":{"type":"string","description":"Code of the travel credit issued to the member's wallet, if any."},"currency":{"type":"string","description":"Currency code."}},"required":["reservation","refundAmount","travelCredit","refundable","reason","within24HourGracePeriod","currency"]},"SeatAssignResult":{"type":"object","description":"Result of assigning a seat.","properties":{"reservation":{"$ref":"#/components/schemas/Reservation","description":"Updated reservation."},"seat":{"$ref":"#/components/schemas/Seat","description":"The assigned seat."},"segmentId":{"type":"string","description":"Segment affected."},"passengerId":{"type":"string","description":"Passenger affected."},"feeCharged":{"type":"number","description":"Preferred-seat fee charged (0 for standard seats or waived elites)."},"feeWaived":{"type":"boolean","description":"true if a preferred-seat fee was waived by tier."},"feeWaivedReason":{"type":"string","description":"Why the fee was waived."}},"required":["reservation","seat","segmentId","passengerId","feeCharged","feeWaived"]},"CheckInResult":{"type":"object","description":"Result of checking in.","properties":{"reservation":{"$ref":"#/components/schemas/Reservation","description":"Updated reservation."},"segmentId":{"type":"string","description":"Segment checked in."},"boardingPasses":{"type":"array","items":{"$ref":"#/components/schemas/BoardingPass"},"description":"Boarding passes issued."}},"required":["reservation","segmentId","boardingPasses"]},"PerBagFee":{"type":"object","description":"The fee breakdown for one checked bag by its absolute position.","properties":{"position":{"type":"integer","description":"Absolute bag position for this passenger (1-indexed)."},"itemType":{"type":"string","description":"standard | sporting_equipment | musical_instrument | firearm | pet."},"baseFee":{"type":"number","description":"Position fee ($0 if within the free allowance; flat $200 for a cargo pet)."},"overweightFee":{"type":"number","description":"Overweight surcharge (51–100 lb)."},"oversizeFee":{"type":"number","description":"Oversize surcharge (63–115 linear in; waived for sporting equipment)."},"refused":{"type":"boolean","description":"true if the bag exceeds 100 lb or 115 in and was refused."},"totalFee":{"type":"number","description":"Base + overweight + oversize for this bag."},"note":{"type":"string","description":"Handling note for special item types (firearm case, pet, etc.)."}},"required":["position","itemType","baseFee","overweightFee","oversizeFee","refused","totalFee"]},"BaggageResult":{"type":"object","description":"Result of adding baggage, with the free-bag entitlement applied and a per-bag fee breakdown.","properties":{"reservation":{"$ref":"#/components/schemas/Reservation","description":"Updated reservation."},"bagsAdded":{"type":"integer","description":"Bags added in this call."},"totalBags":{"type":"integer","description":"Total bags for the passenger on the segment."},"charge":{"type":"number","description":"Amount charged (equals feeChargedUsd)."},"feeChargedUsd":{"type":"number","description":"Total fee charged for this call."},"includedBags":{"type":"integer","description":"Effective free-bag allowance (best of fare vs tier)."},"includedBagsSource":{"type":"string","description":"fare | tier — which allowance won."},"overweightFee":{"type":"number","description":"Total overweight surcharge across the added bags."},"oversizeFee":{"type":"number","description":"Total oversize surcharge across the added bags."},"perBagFees":{"type":"array","items":{"$ref":"#/components/schemas/PerBagFee"},"description":"Per-bag fee breakdown."},"currency":{"type":"string","description":"Currency code."}},"required":["reservation","bagsAdded","totalBags","charge","feeChargedUsd","includedBags","includedBagsSource","overweightFee","oversizeFee","perBagFees","currency"]},"BaggageFeeSchedulePerBag":{"type":"object","description":"One row of the position-based checked-bag fee table.","properties":{"position":{"type":"integer","description":"Bag position (1, 2, or 3 for 3rd+)."},"feeUsd":{"type":"number","description":"Fee for a bag at this position, per direction."},"label":{"type":"string","description":"Human label, e.g. \"1st checked bag\"."}},"required":["position","feeUsd","label"]},"BaggageFeeSchedule":{"type":"object","description":"The single current checked-bag fee schedule (no effective dates); the website, API, and KB read these same numbers.","properties":{"currency":{"type":"string","description":"Currency code (USD)."},"perBag":{"type":"array","items":{"$ref":"#/components/schemas/BaggageFeeSchedulePerBag"},"description":"Position-based base fees."},"perDirection":{"type":"boolean","description":"true — fees are per direction, not round trip."},"overweight":{"type":"object","description":"{ appliesFromLbs, maxLbs, feeUsd, refusedOverLbs }."},"oversize":{"type":"object","description":"{ appliesFromLinearInches, maxLinearInches, feeUsd, refusedOverLinearInches }."},"notes":{"type":"string","description":"How the fee is applied."},"summary":{"type":"string","description":"Plain-English fee summary."}},"required":["currency","perBag","perDirection","overweight","oversize","notes","summary"]},"UpgradeResult":{"type":"object","description":"Result of a cabin upgrade.","properties":{"reservation":{"$ref":"#/components/schemas/Reservation","description":"Updated reservation."},"upgraded":{"type":"boolean","description":"true if upgraded."},"fromCabin":{"type":"string","description":"Original cabin."},"toCabin":{"type":"string","description":"New cabin."},"method":{"type":"string","description":"complimentary | miles | miles_plus_money | paid."},"milesUsed":{"type":"integer","description":"Miles redeemed (0 unless method=miles or miles_plus_money)."},"charge":{"type":"number","description":"Cash charged (fare difference for paid, or the copay for miles_plus_money; 0 otherwise)."},"currency":{"type":"string","description":"Currency code."}},"required":["reservation","upgraded","fromCabin","toCabin","method","milesUsed","charge","currency"]},"Health":{"type":"object","description":"Service liveness and store size.","properties":{"status":{"type":"string","description":"\"ok\"."},"generatedAt":{"type":"string","description":"ISO time the timetable was seeded."},"flights":{"type":"integer","description":"Flights in the store."},"reservations":{"type":"integer","description":"Reservations in the store."}},"required":["status","generatedAt","flights","reservations"]},"Destination":{"type":"object","description":"A nonstop destination reachable from an origin, with a from-price.","properties":{"code":{"type":"string","description":"Destination airport code."},"city":{"type":"string","description":"Destination city."},"country":{"type":"string","description":"Destination country."},"international":{"type":"boolean","description":"true if crossing a border from the origin."},"fromPrice":{"type":"number","description":"Lowest economy fare on an upcoming nonstop."},"currency":{"type":"string","description":"Currency code."}},"required":["code","city","country","international","fromPrice","currency"]},"TravelCredit":{"type":"object","description":"A travel credit certificate in a member's wallet (issued on cancellation).","properties":{"code":{"type":"string","description":"Certificate code (redeem at checkout)."},"pin":{"type":"string","description":"Certificate PIN."},"amount":{"type":"number","description":"Original amount issued."},"amountRemaining":{"type":"number","description":"Amount still available."},"currency":{"type":"string","description":"Currency code."},"issuedAt":{"type":"string","description":"ISO issue instant."},"expiresAt":{"type":"string","description":"ISO expiry (12 months from issue)."},"sourcePnr":{"type":"string","description":"The cancelled booking it came from."}},"required":["code","pin","amount","amountRemaining","currency","issuedAt","expiresAt","sourcePnr"]},"Wallet":{"type":"object","description":"A member's travel-credit wallet.","properties":{"memberId":{"type":"string","description":"Member number."},"credits":{"type":"array","items":{"$ref":"#/components/schemas/TravelCredit"},"description":"Credit certificates."},"totalRemaining":{"type":"number","description":"Sum of remaining balances."},"currency":{"type":"string","description":"Currency code."}},"required":["memberId","credits","totalRemaining","currency"]},"ResetResult":{"type":"object","description":"Result of resetting demo data.","properties":{"generatedAt":{"type":"string","description":"ISO time of the fresh seed."},"flights":{"type":"integer","description":"Flights seeded."},"reservations":{"type":"integer","description":"Reservations seeded."}},"required":["generatedAt","flights","reservations"]},"Lounge":{"type":"object","description":"A Meridian Lounge location.","properties":{"id":{"type":"string","description":"Lounge id."},"airportCode":{"type":"string","description":"Airport code."},"city":{"type":"string","description":"City."},"name":{"type":"string","description":"Lounge name."},"location":{"type":"string","description":"Terminal/concourse location."},"hoursOpen":{"type":"string","description":"Local opening time (HH:MM)."},"hoursClose":{"type":"string","description":"Local closing time (HH:MM)."},"dayPassAvailable":{"type":"boolean","description":"true if day passes are sold here."},"international":{"type":"boolean","description":"true for an international-gateway lounge."}},"required":["id","airportCode","city","name","location","hoursOpen","hoursClose","dayPassAvailable","international"]},"LoungeEligibility":{"type":"object","description":"Precomputed lounge-access decision for a passenger on a segment.","properties":{"eligible":{"type":"boolean","description":"true if complimentary access applies (no pass needed)."},"method":{"type":"string","description":"membership | paid_award_first | paid_award_business_intl | day_pass_required | upgrade_pass_only | none."},"guestAllowance":{"type":"integer","description":"Guests the entitlement admits."},"dayPassPriceUsd":{"type":"number","description":"Price if a day/upgrade pass is the path in, else null."},"loungesOnItinerary":{"type":"array","items":{"type":"object"},"description":"Lounges at airports on this itinerary ({airportCode, name, location})."},"reason":{"type":"string","description":"Plain-English explanation of the decision."}},"required":["eligible","method","guestAllowance","loungesOnItinerary","reason"]},"LoungePassPurchase":{"type":"object","description":"A purchased single-entry lounge pass.","properties":{"id":{"type":"string","description":"Pass id."},"pnr":{"type":"string","description":"Reservation."},"passengerId":{"type":"string","description":"Passenger."},"airportCode":{"type":"string","description":"Lounge airport."},"loungeName":{"type":"string","description":"Lounge name."},"type":{"type":"string","description":"day_pass ($65) | upgrade_pass ($35)."},"priceUsd":{"type":"number","description":"Price charged."},"purchasedAt":{"type":"string","description":"ISO purchase instant."}},"required":["id","pnr","passengerId","airportCode","loungeName","type","priceUsd","purchasedAt"]},"LoungeMembershipStatus":{"type":"object","description":"A member's lounge membership.","properties":{"memberId":{"type":"string","description":"Member number."},"membership":{"type":"object","description":"{tier: none|standard|lounge_plus, purchasedAt?, expiresAt?, autoRenew?}."}},"required":["memberId","membership"]},"UpgradeQuoteMethod":{"type":"object","description":"One available upgrade method with its cost.","properties":{"method":{"type":"string","description":"complimentary | miles | miles_plus_money | paid."},"available":{"type":"boolean","description":"true if seats are available for this method."},"milesCost":{"type":"integer","description":"Miles required (miles_plus_money)."},"copayUsd":{"type":"number","description":"Cash copay (miles_plus_money)."},"chargeUsd":{"type":"number","description":"Fare difference (paid)."},"clearsAt":{"type":"string","description":"When a complimentary upgrade starts clearing."},"note":{"type":"string","description":"Plain-English description."}},"required":["method","available","note"]},"UpgradeQuote":{"type":"object","description":"All upgrade options for a segment.","properties":{"segmentId":{"type":"string","description":"Segment."},"fromCabin":{"type":"string","description":"Current cabin."},"targetCabin":{"type":"string","description":"Target cabin."},"distanceMiles":{"type":"integer","description":"Segment distance (drives banding)."},"methods":{"type":"array","items":{"$ref":"#/components/schemas/UpgradeQuoteMethod"},"description":"Available upgrade methods."},"summary":{"type":"string","description":"Plain-English summary."}},"required":["segmentId","fromCabin","targetCabin","distanceMiles","methods","summary"]},"AwardQuote":{"type":"object","description":"A distance-/region-based 'starting at' award price.","properties":{"origin":{"type":"string","description":"Origin code."},"destination":{"type":"string","description":"Destination code."},"cabin":{"type":"string","description":"Cabin."},"distanceMiles":{"type":"integer","description":"Route distance."},"pointsRequiredFrom":{"type":"integer","description":"Starting-at miles."},"taxesFeesFromUsd":{"type":"number","description":"Starting-at taxes/fees."},"currency":{"type":"string","description":"Currency code."},"summary":{"type":"string","description":"Plain-English summary."}},"required":["origin","destination","cabin","distanceMiles","pointsRequiredFrom","taxesFeesFromUsd","currency","summary"]},"DisruptionCareEligibility":{"type":"object","description":"Authoritative per-passenger, per-segment disruption-care flags (answer from these, not from the rule prose).","properties":{"segmentId":{"type":"string","description":"Segment."},"passengerId":{"type":"string","description":"Passenger."},"tier":{"type":"string","description":"Meridian tier used in the computation."},"disrupted":{"type":"boolean","description":"true if the segment's flight is delayed or cancelled."},"controllable":{"type":"boolean","description":"true if the disruption is airline-controlled."},"delayMinutes":{"type":"integer","description":"Current delay minutes."},"cancelled":{"type":"boolean","description":"true if the flight is cancelled."},"mealVoucherEligible":{"type":"boolean","description":"3h+ (or cancel), controllable, Silver+."},"hotelEligible":{"type":"boolean","description":"Controllable overnight (cancel or 4h+)."},"groundTransportEligible":{"type":"boolean","description":"Same basis as hotel."},"loungePassEligible":{"type":"boolean","description":"Controllable disruption."},"complimentaryUpgradeEligible":{"type":"boolean","description":"Platinum, or 6h+ controllable."},"reason":{"type":"string","description":"Plain-English explanation."}},"required":["segmentId","passengerId","tier","disrupted","controllable","delayMinutes","cancelled","mealVoucherEligible","hotelEligible","groundTransportEligible","loungePassEligible","complimentaryUpgradeEligible","reason"]},"ServiceRecoveryOffer":{"type":"object","description":"A goodwill gesture issued for an airline-controlled disruption.","properties":{"id":{"type":"string","description":"Offer id."},"pnr":{"type":"string","description":"Reservation."},"segmentId":{"type":"string","description":"Segment."},"type":{"type":"string","description":"lounge_pass | meal_voucher | discount_code | miles_credit."},"amountUsd":{"type":"number","description":"Cash value where applicable."},"milesAmount":{"type":"integer","description":"Miles value where applicable."},"issuedAt":{"type":"string","description":"ISO issue instant."},"reason":{"type":"string","description":"Why it was issued."}},"required":["id","pnr","segmentId","type","issuedAt","reason"]},"DeniedBoardingResult":{"type":"object","description":"A denied-boarding / oversold event with server-computed compensation (DOT/APPR).","properties":{"id":{"type":"string","description":"Event id."},"pnr":{"type":"string","description":"Reservation."},"passengerId":{"type":"string","description":"Passenger."},"flightId":{"type":"string","description":"Flight."},"type":{"type":"string","description":"voluntary | involuntary."},"arrivalDelayMinutes":{"type":"integer","description":"Delay to the passenger's arrival."},"compensationType":{"type":"string","description":"cash | voucher."},"compensationAmount":{"type":"number","description":"Computed amount (capped per rule)."},"currency":{"type":"string","description":"USD or CAD."},"reason":{"type":"string","description":"Plain-English explanation of the calculation."}},"required":["id","pnr","passengerId","flightId","type","arrivalDelayMinutes","compensationType","compensationAmount","currency","reason"]},"SpecialServiceRequest":{"type":"object","description":"A special-service request (accessibility, animals, pets, medical, UM).","properties":{"id":{"type":"string","description":"SSR id."},"passengerId":{"type":"string","description":"Passenger."},"segmentId":{"type":"string","description":"Segment, if scoped to one."},"type":{"type":"string","description":"wheelchair | service_animal | pet_cabin | poc_oxygen | deaf_hard_of_hearing | blind_low_vision | allergy | unaccompanied_minor."},"status":{"type":"string","description":"requested | confirmed | denied."},"feeUsd":{"type":"number","description":"Fee ($0 for accessibility; $100 cabin pet)."},"requestedAt":{"type":"string","description":"ISO request instant."},"details":{"type":"object","description":"Type-specific details (animal, device, guardian, etc.)."}},"required":["id","passengerId","type","status","feeUsd","requestedAt"]},"UnaccompaniedMinorResult":{"type":"object","description":"Registered Unaccompanied Minor service.","properties":{"pnr":{"type":"string","description":"Reservation."},"passengerId":{"type":"string","description":"The minor."},"feeUsd":{"type":"number","description":"UM fee ($50 for ages 5–12, unless waived)."},"waived":{"type":"boolean","description":"true if waived for a Gold/Platinum guardian."},"guardianContact":{"type":"object","description":"Drop-off / pickup contacts."},"ssr":{"$ref":"#/components/schemas/SpecialServiceRequest","description":"The underlying UM special-service record."}},"required":["pnr","passengerId","feeUsd","waived","guardianContact","ssr"]},"FamilySeatingResult":{"type":"object","description":"Result of auto-assigning adjacent family seats.","properties":{"pnr":{"type":"string","description":"Reservation."},"segmentId":{"type":"string","description":"Segment."},"adjacencyMet":{"type":"boolean","description":"true if adjacent seats were found and assigned."},"assignments":{"type":"array","items":{"type":"object"},"description":"{passengerId, seat} for each assigned passenger."}},"required":["pnr","segmentId","adjacencyMet","assignments"]},"BaggageClaim":{"type":"object","description":"A filed baggage claim.","properties":{"fileId":{"type":"string","description":"Claim file id."},"passengerId":{"type":"string","description":"Passenger."},"segmentId":{"type":"string","description":"Segment."},"type":{"type":"string","description":"delayed | damaged | lost | left_on_board."},"status":{"type":"string","description":"open | located | closed."},"filedAt":{"type":"string","description":"ISO filing instant."},"liabilityCapUsd":{"type":"number","description":"Applicable liability cap ($4,700 domestic / ~$2,100 international)."}},"required":["fileId","passengerId","segmentId","type","status","filedAt","liabilityCapUsd"]},"CarryOnPolicy":{"type":"object","description":"Carry-on / personal-item / lithium-battery reference policy for an aircraft type.","properties":{"aircraft":{"type":"string","description":"Aircraft type."},"carryOn":{"type":"object","description":"{count, maxLinearInches, maxWeightLbs, free}."},"personalItem":{"type":"object","description":"{count, maxDimensionsInches, free}."},"gateCheckLikely":{"type":"boolean","description":"true on regional aircraft where roller bags are gate-checked."},"lithiumBattery":{"type":"object","description":"Spare-battery rules by watt-hour."},"summary":{"type":"string","description":"Plain-English summary."}},"required":["aircraft","carryOn","personalItem","gateCheckLikely","lithiumBattery","summary"]}}},"paths":{"/api/health":{"get":{"operationId":"health","summary":"Liveness check and store size. Use to confirm the API is up. No authentication.","security":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Health"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/airports":{"get":{"operationId":"listAirports","summary":"List every airport in the Agentic Airways network, for building search UIs or validating codes.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Airport"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/destinations":{"get":{"operationId":"getDestinations","summary":"Nonstop destinations reachable from an origin, cheapest-first — answers \"where can I fly from here?\".","parameters":[{"name":"origin","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Origin airport code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Destination"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/flights/search":{"get":{"operationId":"searchFlights","summary":"Search for a route on a date. Always returns nonstop AND connecting options (connections route through a hub — London/New York/Los Angeles — with a ≥2-hour connection).","parameters":[{"name":"origin","in":"query","required":true,"schema":{"type":"string"},"description":"Required. Origin airport code, e.g. SEA."},{"name":"destination","in":"query","required":true,"schema":{"type":"string"},"description":"Required. Destination airport code, e.g. JFK."},{"name":"date","in":"query","required":true,"schema":{"type":"string"},"description":"Required. Departure date, YYYY-MM-DD (origin-local)."},{"name":"passengers","in":"query","required":false,"schema":{"type":"integer"},"description":"Optional. Seats needed for availability (default 1)."},{"name":"cabin","in":"query","required":false,"schema":{"type":"string"},"description":"Optional. Preferred cabin (economy | premium | business | first); flights lacking it are still returned."},{"name":"maxConnections","in":"query","required":false,"schema":{"type":"integer"},"description":"Optional. Max connecting options to return (default 4)."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Itinerary"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/flights/status":{"get":{"operationId":"getFlightStatus","summary":"Get live status (on-time/delayed/cancelled + reason) for a flight number. Defaults to the next upcoming departure.","parameters":[{"name":"flightNumber","in":"query","required":true,"schema":{"type":"string"},"description":"Required. Flight number, e.g. AG145."},{"name":"date","in":"query","required":false,"schema":{"type":"string"},"description":"Optional. Pin to a specific departure date, YYYY-MM-DD."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Flight"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/flights/{flightId}":{"get":{"operationId":"getFlight","summary":"Retrieve one flight by its instance id, with fares and live status.","parameters":[{"name":"flightId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Flight id, e.g. AG145-2026-08-20."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Flight"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/flights/{flightId}/seatmap":{"get":{"operationId":"getSeatMap","summary":"Get the seat map and live seat availability for a flight.","parameters":[{"name":"flightId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Flight id."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SeatMap"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations":{"post":{"operationId":"createReservation","summary":"Book a flight (create a reservation). Pass one flightId per segment; a connecting journey has multiple flightIds.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reservation"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"flightIds":{"type":"array","items":{"type":"string"},"description":"Required. Flight ids to book, one per segment."},"cabin":{"type":"string","description":"Optional. Default cabin for all segments (economy | premium | business | first); defaults to economy."},"cabins":{"type":"array","items":{"type":"string"},"description":"Optional. Per-segment cabins, parallel to flightIds (overrides cabin)."},"passengers":{"type":"array","items":{"type":"object"},"description":"Required. Passengers: { firstName, lastName, email?, dateOfBirth?, loyaltyId? }."},"contactEmail":{"type":"string","description":"Optional. Contact email for the booking."},"loyaltyId":{"type":"string","description":"Optional. Meridian Club member id to attach."},"travelCreditCodes":{"type":"array","items":{"type":"string"},"description":"Optional. Travel-credit certificate codes to redeem against the total."}},"required":["flightIds","passengers"]}}}}}},"/api/reservations/preview":{"post":{"operationId":"previewBooking","summary":"Price a NEW booking WITHOUT committing (preview-before-book). Non-mutating: nothing is created, no inventory is taken, and travel credits are quoted but NOT redeemed. Shares pricing with the real create path so the quote can never differ from what booking charges.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BookingPreview"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"flightIds":{"type":"array","items":{"type":"string"},"description":"Required. Flight ids to price, one per segment."},"cabin":{"type":"string","description":"Optional. Default cabin for all segments (economy | premium | business | first); defaults to economy."},"cabins":{"type":"array","items":{"type":"string"},"description":"Optional. Per-segment cabins, parallel to flightIds (overrides cabin)."},"passengers":{"type":"array","items":{"type":"object"},"description":"Required. Passengers: { firstName, lastName, email?, dateOfBirth?, loyaltyId? }."},"contactEmail":{"type":"string","description":"Optional. Contact email for the booking."},"loyaltyId":{"type":"string","description":"Optional. Meridian Club member id to attach."},"travelCreditCodes":{"type":"array","items":{"type":"string"},"description":"Optional. Travel-credit certificate codes to quote against the total (not redeemed)."}},"required":["flightIds","passengers"]}}}}}},"/api/reservations/{pnr}":{"get":{"operationId":"getReservation","summary":"Retrieve a reservation by confirmation code and last name.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). 6-char confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name on the booking."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reservation"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/passenger":{"post":{"operationId":"updatePassenger","summary":"Correct a traveller's name or date of birth on a booking (e.g. fix a spelling).","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reservation"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. A current passenger last name on the PNR (for lookup)."},"passengerId":{"type":"string","description":"Required. The passenger to update."},"firstName":{"type":"string","description":"Optional. New first name."},"newLastName":{"type":"string","description":"Optional. New last name."},"dateOfBirth":{"type":"string","description":"Optional. New date of birth (YYYY-MM-DD)."}},"required":["lastName","passengerId"]}}}}}},"/api/reservations/{pnr}/change":{"post":{"operationId":"changeFlight","summary":"Change/rebook one segment onto a different flight. Seats reset and a fare difference is computed.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ChangeResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Segment to change."},"newFlightId":{"type":"string","description":"Required. Replacement flight id."},"cabin":{"type":"string","description":"Optional. New cabin (economy | premium | business | first); defaults to current."}},"required":["lastName","segmentId","newFlightId"]}}}}}},"/api/reservations/{pnr}/change-preview":{"get":{"operationId":"getChangePreview","summary":"Quote a flight change (fare difference / waiver / reason) WITHOUT committing — the read-only counterpart to change.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."},{"name":"segmentId","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Segment to change."},{"name":"newFlightId","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Replacement flight id."},{"name":"cabin","in":"query","required":false,"schema":{"type":"string"},"description":"Optional (query). New cabin (economy | premium | business | first); defaults to current."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ChangePreview"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/cancel":{"post":{"operationId":"cancelReservation","summary":"Cancel a reservation. Refundable fares are refunded; others become travel credit.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CancelResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."}},"required":["lastName"]}}}}}},"/api/reservations/{pnr}/cancel-preview":{"get":{"operationId":"getCancelPreview","summary":"Quote a cancellation outcome (refund vs. travel credit + reason) WITHOUT committing — the read-only counterpart to cancel.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CancelPreview"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/seats":{"post":{"operationId":"assignSeat","summary":"Assign or change a seat for a passenger on a segment.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SeatAssignResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Segment."},"passengerId":{"type":"string","description":"Required. Passenger reference."},"seat":{"type":"string","description":"Required. Seat number, e.g. 14C."}},"required":["lastName","segmentId","passengerId","seat"]}}}}}},"/api/reservations/{pnr}/checkin":{"post":{"operationId":"checkIn","summary":"Check in for a flight (opens 24h before departure, closes 60m before). Auto-assigns a seat to anyone without one and issues boarding passes.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CheckInResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Optional. Segment; defaults to the next upcoming segment."},"passengerIds":{"type":"array","items":{"type":"string"},"description":"Optional. Passengers to check in; defaults to all."}},"required":["lastName"]}}}}}},"/api/reservations/{pnr}/boarding-passes":{"get":{"operationId":"getBoardingPasses","summary":"List boarding passes already issued for a reservation.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BoardingPass"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/baggage":{"post":{"operationId":"addBaggage","summary":"Add checked bags for a passenger on a segment. The effective free allowance is the best of the fare and the member's Meridian tier; fees are by absolute bag position with additive overweight/oversize surcharges.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BaggageResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Segment."},"passengerId":{"type":"string","description":"Required. Passenger reference."},"count":{"type":"integer","description":"Required. Number of bags to add (≥1)."},"items":{"type":"array","items":{"type":"object"},"description":"Optional. Per-bag { weightLbs?, linearInches?, itemType? } (index-aligned to count). itemType = standard | sporting_equipment (oversize waived) | musical_instrument | firearm (locked case) | pet (flat $200 cargo). A bag over 100 lb or 115 in is refused (409)."}},"required":["lastName","segmentId","passengerId","count"]}}}}}},"/api/baggage/fee-schedule":{"get":{"operationId":"getBaggageFeeSchedule","summary":"The single current checked-bag fee schedule (1st $45, 2nd $55, 3rd+ $200 per direction, plus overweight/oversize surcharges). The website, API, and KB all read these same numbers.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BaggageFeeSchedule"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/upgrade":{"post":{"operationId":"requestUpgrade","summary":"Request a cabin upgrade. Pass `method` to commit a specific option from the upgrade quote (charged/deducted at the quoted amount); omit it to auto-select complimentary → miles → paid.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UpgradeResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Segment to upgrade."},"targetCabin":{"type":"string","description":"Optional. Target cabin (premium | business | first); defaults to next cabin up."},"method":{"type":"string","description":"Optional. Commit a specific upgrade method: complimentary | miles | miles_plus_money | paid. Amounts match the upgrade quote for that method; an ineligible method is rejected. Omit to auto-select."}},"required":["lastName","segmentId"]}}}}}},"/api/loyalty/{memberId}":{"get":{"operationId":"getLoyalty","summary":"Look up a Meridian Club loyalty account by member number (includes the member's tier benefits).","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number, e.g. AG7781234."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Loyalty"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/loyalty/{memberId}/profile":{"post":{"operationId":"updateLoyaltyProfile","summary":"Update a member's own profile (name / email / phone). Tier and miles are not editable here.","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Loyalty"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"firstName":{"type":"string","description":"Optional. New first name."},"lastName":{"type":"string","description":"Optional. New last name."},"email":{"type":"string","description":"Optional. New account email."},"phone":{"type":"string","description":"Optional. New contact phone (empty string clears it)."},"dateOfBirth":{"type":"string","description":"Optional. Date of birth (YYYY-MM-DD)."}}}}}}}},"/api/wallet/{memberId}":{"get":{"operationId":"getWallet","summary":"A member's travel-credit wallet — certificate balances and expirations (redeem codes at booking via travelCreditCodes).","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Wallet"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/loyalty/{memberId}/reservations":{"get":{"operationId":"getMemberReservations","summary":"All reservations belonging to a member (matched by Meridian number or account email); segments carry `departed` so you can split upcoming vs. past.","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Reservation"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/loyalty/{memberId}/benefits":{"get":{"operationId":"getLoyaltyBenefits","summary":"The member's tier entitlements (free checked bags, complimentary-upgrade cabins + clearance windows, complimentary preferred seating) so the agent quotes benefits from data.","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number, e.g. AG7781234."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TierBenefits"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/upgrade-quote":{"get":{"operationId":"getUpgradeQuote","summary":"Quote all upgrade methods for a segment — complimentary (with clearance time), miles + money hybrid, and paid fare difference.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."},{"name":"segmentId","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Segment to upgrade."},{"name":"targetCabin","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). premium | business | first."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UpgradeQuote"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/award-quote":{"get":{"operationId":"getAwardQuote","summary":"Distance-/region-based 'starting at' award price for a route + cabin (the 'Quote Award Redemption' action).","parameters":[{"name":"origin","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Origin code."},{"name":"destination","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Destination code."},{"name":"cabin","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). economy | premium | business | first."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AwardQuote"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/lounge/locations":{"get":{"operationId":"listLounges","summary":"The Meridian Lounge network (optionally filtered by airport).","parameters":[{"name":"airportCode","in":"query","required":false,"schema":{"type":"string"},"description":"Optional (query). Filter to one airport."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Lounge"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/lounge-eligibility":{"get":{"operationId":"getLoungeEligibility","summary":"Precomputed lounge-access decision for a passenger on a segment (membership / eligible First / international Business / day pass), so the agent never says 'yes' from tier alone.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."},{"name":"segmentId","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Segment."},{"name":"passengerId","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger reference."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LoungeEligibility"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/lounge/day-pass":{"post":{"operationId":"purchaseLoungeDayPass","summary":"Buy a single-entry Meridian Lounge pass ($65, or $35 for a complimentary-upgrade guest); requires same-day travel from a lounge airport.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LoungePassPurchase"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pnr":{"type":"string","description":"Required. Confirmation code."},"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Segment departing from the lounge airport."},"passengerId":{"type":"string","description":"Required. Passenger reference."}},"required":["pnr","lastName","segmentId","passengerId"]}}}}}},"/api/lounge/membership/{memberId}":{"get":{"operationId":"getLoungeMembership","summary":"A member's Meridian Lounge membership status.","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LoungeMembershipStatus"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}},"post":{"operationId":"purchaseLoungeMembership","summary":"Purchase or renew a Meridian Lounge membership (1-year term).","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Member number."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LoungeMembershipStatus"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tier":{"type":"string","description":"Required. standard | lounge_plus."}},"required":["tier"]}}}}}},"/api/reservations/{pnr}/disruption-care":{"get":{"operationId":"getDisruptionCare","summary":"Authoritative per-passenger disruption-care flags (meal/hotel/ground/lounge/upgrade), computed from the live delay + tier + controllability. Answer care questions from these, not the rule prose.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."},{"name":"segmentId","in":"query","required":false,"schema":{"type":"string"},"description":"Optional (query). Limit to one segment; defaults to all."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DisruptionCareEligibility"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/service-recovery":{"get":{"operationId":"getServiceRecovery","summary":"List goodwill gestures issued on a reservation.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceRecoveryOffer"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}},"post":{"operationId":"issueServiceRecovery","summary":"Issue a goodwill gesture (lounge pass / meal voucher / discount code / miles). 409 unless the disruption is airline-controlled; goodwill money/miles require a 3h+ delay or cancellation.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceRecoveryOffer"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Disrupted segment."},"type":{"type":"string","description":"Required. lounge_pass | meal_voucher | discount_code | miles_credit."}},"required":["lastName","segmentId","type"]}}}}}},"/api/reservations/{pnr}/denied-boarding":{"get":{"operationId":"getDeniedBoarding","summary":"List denied-boarding / oversold events recorded on a reservation.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DeniedBoardingResult"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}},"post":{"operationId":"recordDeniedBoarding","summary":"Record a denied-boarding / oversold event. Compensation is computed server-side (US DOT 200%/400% capped $1,075/$2,150; Canada APPR CAD 400/800); never trust a client-supplied amount.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeniedBoardingResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Affected segment."},"passengerId":{"type":"string","description":"Required. Passenger reference."},"type":{"type":"string","description":"Required. voluntary | involuntary."},"arrivalDelayMinutes":{"type":"integer","description":"Required. Delay to the passenger's arrival."}},"required":["lastName","segmentId","passengerId","type","arrivalDelayMinutes"]}}}}}},"/api/reservations/{pnr}/special-services":{"get":{"operationId":"getSpecialServices","summary":"List a reservation's special-service requests.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SpecialServiceRequest"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}},"post":{"operationId":"addSpecialService","summary":"Create a special-service request (wheelchair, service animal, cabin pet, portable oxygen, allergy, etc.). Charges the correct fee ($0 accessibility / $100 cabin pet). A restricting SSR blocks exit-row seat assignment.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SpecialServiceRequest"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"passengerId":{"type":"string","description":"Required. Passenger reference."},"type":{"type":"string","description":"Required. wheelchair | service_animal | pet_cabin | poc_oxygen | deaf_hard_of_hearing | blind_low_vision | allergy."},"segmentId":{"type":"string","description":"Optional. Scope to one segment."},"details":{"type":"object","description":"Optional. Type-specific details."}},"required":["lastName","passengerId","type"]}}}}}},"/api/reservations/{pnr}/unaccompanied-minor":{"post":{"operationId":"registerUnaccompaniedMinor","summary":"Register Unaccompanied Minor service for a child (ages 5–17). Fee is $50 for ages 5–12, waived for a Gold/Platinum guardian. (Illegal lone-minor itineraries are rejected at booking.)","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UnaccompaniedMinorResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"passengerId":{"type":"string","description":"Required. The minor."},"guardianContact":{"type":"object","description":"Required. Drop-off / pickup contact details."}},"required":["lastName","passengerId","guardianContact"]}}}}}},"/api/reservations/{pnr}/seats/auto-assign-family":{"post":{"operationId":"autoAssignFamily","summary":"Batch-assign adjacent seats for everyone on a segment (family seating; child ≤13 next to an adult, no charge).","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FamilySeatingResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Segment."}},"required":["lastName","segmentId"]}}}}}},"/api/aircraft/{type}/carry-on-policy":{"get":{"operationId":"getCarryOnPolicy","summary":"Carry-on, personal-item, and lithium-battery reference policy for an aircraft type (gate-check likelihood on regionals).","parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Aircraft type, e.g. 'Boeing 787-9'."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CarryOnPolicy"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/reservations/{pnr}/baggage-claims":{"get":{"operationId":"getBaggageClaims","summary":"List baggage claims filed on a reservation.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."},{"name":"lastName","in":"query","required":true,"schema":{"type":"string"},"description":"Required (query). Passenger last name."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BaggageClaim"}}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}},"post":{"operationId":"fileBaggageClaim","summary":"File a baggage claim (delayed / damaged / lost / left_on_board) and return the file id + applicable liability cap.","parameters":[{"name":"pnr","in":"path","required":true,"schema":{"type":"string"},"description":"Required (path). Confirmation code."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BaggageClaim"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lastName":{"type":"string","description":"Required. Passenger last name."},"segmentId":{"type":"string","description":"Required. Affected segment."},"passengerId":{"type":"string","description":"Required. Passenger reference."},"type":{"type":"string","description":"Required. delayed | damaged | lost | left_on_board."}},"required":["lastName","segmentId","passengerId","type"]}}}}}},"/api/loyalty":{"post":{"operationId":"enrollMember","summary":"Enroll a new Meridian Club member (Blue tier) and return their member number.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Loyalty"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"firstName":{"type":"string","description":"Required. First name."},"lastName":{"type":"string","description":"Required. Last name."},"email":{"type":"string","description":"Required. Email."},"dateOfBirth":{"type":"string","description":"Optional. Date of birth (YYYY-MM-DD)."}},"required":["firstName","lastName","email"]}}}}}},"/api/operations":{"get":{"operationId":"getOperations","summary":"Operational snapshot: on-time performance and categorized disruptions across flights departing within the window.","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer"},"description":"Optional. Window size in days (default 7)."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OperationsSnapshot"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/api/admin/reset":{"post":{"operationId":"resetDemo","summary":"Reset all demo data (flights, reservations, loyalty) to a clean seed. Use to restore a known state before a demo.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResetResult"}}}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}}}}