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 book() 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_ancillariesbook()→ 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
| Field | Type | Notes |
|---|---|---|
offer_id | string | Pass this to select_ancillaries |
category | enum | See the 11 values below |
label | string | Human-readable, e.g. "1 bag · 23kg" |
description | string | Longer description |
price | Money | { amount, currency, decimal_places }; absent = free |
scope | enum | Who/what it applies to (see below) |
max_quantity | integer | Max units selectable |
mutually_exclusive | string[] | offer_ids that conflict with this one |
segment_ref_ids | string[] | Segments it applies to |
journey_ref_id | string | Journey it applies to |
applicable_pax_types | string[] | e.g. ["ADT"] |
provider_metadata | map<string,string> | Pass-through provider data |
baggage_details | object | Present when category = BAGGAGE / CABIN_BAG_UPGRADE |
seat_details | object | Present when category = SEAT |
meal_details | object | Present when category = MEAL |
assistance_details | object | Present when category = SPECIAL_ASSISTANCE |
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.