When an exchange can’t be refunded automatically
Pricing may say that the refund needs Jinko support. Pricing does not open a case: after the traveler confirms, commit the exchange to send the request to support. A commit refusal withmanual_handling.status: "pending" means support has the request and will complete the exchange and refund; there is nothing else for the traveler to do.
Show the refusal message and read get_booking to track items[].servicing.exchange: attention_required, then in_progress, then succeeded with the refund, or failed if support closes the request. Do not retry commit automatically or claim the ticket has already changed. The existing exchange confirmation email is sent on completion; no email is sent when the case opens.
See Flight exchanges for the customer messages and support workflow.
Tool description (what the LLM sees)
Tool description (what the LLM sees)
Parameters
Examples
Shop for exchange options (guest path): Name each leg to change insegments_to_exchange by the airports get_booking lists for it: the leg’s first departure and final arrival, not a connection airport. Legs you do not name stay as booked. This moves only the return of a JFK ⇄ LHR round trip:
offer_id per option. A selection the booking refuses prints its code and the booked legs, for example LEG_ALREADY_DEPARTED for a leg that has flown, or INVALID_SEGMENTS_TO_EXCHANGE for a leg named by a connection airport. An entry the tool’s input check refuses (a missing field, or a date not written YYYY-MM-DD) is answered before the booking is read, without the booked legs.
Price a specific offer:
quote_id to commit against. Moving a ZZ Standard ticket to ZZ Flex on the sandbox test airline prints these lines:
structuredContent.data.customer_amounts carries the same figures as money objects: original_fare (what the traveler paid for the ticket), new_fare (the new ticket’s value), penalty_amount (the airline’s change fee, absent when there is none) total_due or total_refund (exactly what is charged or refunded), and residual_value (the part of the original fare the airline keeps as a credit in the traveler’s name after an exchange to a cheaper fare, present only when the airline reports one; it is not refunded to the card and not part of total_due or total_refund). They add up: original_fare + total_due − total_refund = new_fare + penalty_amount + residual_value, with residual_value counted as 0 when absent, here 789.00 + 298.00 = 1062.00 + 25.00. The top-level fare_difference, original_fare, new_fare and penalty_amount are the supplier’s figures and are deprecated.
Commit the exchange:
ADD_COLLECT), the commit does not change the ticket yet. It prints the payment page:
status prints the same page, and a second commit prints exchange_in_progress instead of starting another exchange. If the customer has not paid by then, the exchange is cancelled within a minute: status prints failed with the reason and no page, nothing is charged, the booking is unchanged, and a new commit starts a new exchange with a new page.
Poll status:
Run the four steps in order. Show the priced
total_due or total_refund and any penalty to the user for confirmation before calling commit. Poll with the same booking_ref and the selected booked_item_id from get_booking.