Skip to main content
Where the airline allows it, you can reserve the PNR without paying and decide later. Create the order with "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

Compute the remaining time as expiresAt − serverTime. Never compare expiresAt with your own clock.

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_FAILED and no PNR exists. Retry, create the order without holdOnly, 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-hold on an order that isn’t OnHold returns 409 ORDER_NOT_ON_HOLD, so a repeated call is harmless.
  • If cancel-hold returns ticketedAtProvider: true, the airline had already ticketed the PNR (for example your staff issued it in the GDS). Nothing was cancelled and the order is IssuedSucceeded.
  • About three hours before the deadline, a reminder email goes to the agency account.