Skip to main content
Ancillaries are the purchasable add-ons on a flight: extra baggage, seat selection, meals, priority boarding, lounge access, and more. They surface on each flight item in a quoted cart, and you select them before checkout.

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 raw flight_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:
Lifecycle:
  1. flight_search → live-priced offer
  2. trip (add item) → flight in the cart
  3. trip (set travelers), required; ancillaries are priced per passenger
  4. GET /v1/trip/{trip_id}/ancillaries → runs the quote behind the scenes and returns items[].available_ancillaries[]
  5. select_ancillaries → move chosen offers into selected_ancillaries[], updating total_with_ancillaries
  6. checkout() → 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; read available_ancillaries off each item.
  • 202 { "status": "pricing", "retry_after_seconds": 2 } + a Retry-After header: the quote is still pricing; poll the same URL until it returns 200.
A completed quote is reused while valid (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

For full seat-map rendering there is also a 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:
Pass the 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.