"holdOnly": true: the order is created, the seats are held at the airline, and nothing is charged. Then either issue it or release it with cancel-hold, in both cases before hold.expiresAt.
1
Check the offer can be held
Only offers with
supportsOnHold: true accept holdOnly. Otherwise create order returns 400 HOLD_NOT_SUPPORTED and no order is created.2
Create the order on hold
Call create order with
"holdOnly": true. The response is the order with status OnHold, a pnr and a hold block.3
Confirm the deadline
If
hold.isFinal is false or hold.expiresAt is null, read the order again a few minutes later. Amadeus, for example, confirms the real ticketing time limit a few minutes after booking. Once isFinal is true the value won’t move.4
Issue or release
Paying is what tickets it: call issue. It skips the reservation step, since the PNR already exists. To give the seats back, call cancel-hold. Nothing was paid, so nothing is refunded.
The hold block
Rules
- A price or itinerary change at hold time returns 409
FLIGHT_PRICE_CHANGED, and nothing is held. - If the airline refuses the hold you get 502
HOLD_FAILEDand no PNR exists. Retry, create the order withoutholdOnly, or pick another offer. - Issuing after the hold has ended returns 409
HOLD_EXPIRED. The PNR is gone: search again and create a new order. cancel-holdon an order that isn’tOnHoldreturns 409ORDER_NOT_ON_HOLD, so a repeated call is harmless.- If
cancel-holdreturnsticketedAtProvider: true, the airline had already ticketed the PNR (for example your staff issued it in the GDS). Nothing was cancelled and the order isIssuedSucceeded. - About three hours before the deadline, a reminder email goes to the agency account.

