How to list ancillaries (REST)
Ancillaries only exist after the flight is priced (the provider, TravelFusion, only emits the catalog at pricing time). They are not on the rawflight_search result, and you should not call checkout() to read them (that mints a checkout URL).
Use the dedicated endpoint instead: it runs the price quote transparently and returns the catalog without generating a checkout URL:
flight_search→ live-priced offertrip(add item) → flight in the carttrip(set travelers), required; ancillaries are priced per passengerGET /v1/trip/{trip_id}/ancillaries→ runs the quote behind the scenes and returnsitems[].available_ancillaries[]select_ancillaries→ move chosen offers intoselected_ancillaries[], updatingtotal_with_ancillariescheckout()→ checkout
Response: ready vs pricing
The quote runs upstream and can take a few seconds, so the call is two-state:
200{ "status": "ready", "items": [...] }: the catalog is ready; readavailable_ancillariesoff each item.202{ "status": "pricing", "retry_after_seconds": 2 }+ aRetry-Afterheader: the quote is still pricing; poll the same URL until it returns200.
expires_at), so repeat calls return instantly. The response never contains a checkout_url.
The SDK exposes this as
client.getAncillaries(tripId). The MCP trip tool surfaces the same available_ancillaries[] on the quoted trip item inside the widget flow. On the Jinko-hosted checkout page, ancillary selection is not currently exposed: build your own UI against available_ancillaries + select_ancillaries.Two response shapes. The REST endpoint above returns a simplified offer per item:
{ offer_id, type, label, display_label, description, price_per_unit, per_pax, max_quantity } (where type is the lower-cased category, e.g. bag, seat, meal, assistance, cabin_bag_upgrade, sports_equipment, other). label is the raw provider string; display_label is a cleaned, human-readable version (HTML entities decoded, provider & component-joiners normalized to , ). Prefer it for display, falling back to label. The richer Ancillary object documented below (category, scope, *_details, …) is what the MCP trip tool returns on the quoted trip item. Both carry the same offer_id you pass to select_ancillaries.The cart item
The Ancillary object
category (11 values): BAGGAGE, SEAT, MEAL, CABIN_BAG_UPGRADE, SPORTS_EQUIPMENT, PRIORITY_BOARDING, SPECIAL_ASSISTANCE, INSURANCE, LOUNGE, FREQUENT_FLYER, OTHER.
scope (4 values): PER_PAX_PER_SEGMENT, PER_PAX_PER_JOURNEY, PER_PAX_PER_BOOKING, PER_BOOKING.
Baggage: baggage_details
Seat: seat_details
SeatMap shape (rows[] → seats[] with availability + features), but for ancillary purchase you use seat_details.available_seats.
Meal: meal_details
Example available_ancillaries
Which ancillaries are returned depends entirely on the airline/provider: many fares return none, LCCs typically return baggage + seats. Always render defensively: any
*_details block is optional and only present for its category.Selecting ancillaries
REST / CLI: discrete operation:offer_id(s) you read from available_ancillaries. Returns the updated selected_ancillaries[] + total_with_ancillaries. (@gojinko/cli: jinko select-ancillaries.)
MCP / plugin: ancillary selection is not a standalone tool; it’s an action of the umbrella trip tool. mcp-apps handles it inside the trip/book widget flow.