Skip to main content
Booking is two calls. Create order (POST /orders) records the order and contacts nobody: no seats are taken and no money moves. Issue (POST /orders/{orderId}/issue) is the purchase: it checks your wallet, books the seats with the airline, charges the wallet and returns the tickets, all in one call. The two are separate so you get an orderId and a price to confirm before committing, and so a hold can be requested at creation. They aren’t meant to be hours apart: the offer behind an un-issued order expires with the search. To hold the PNR without paying and decide later, see On-hold bookings.

Retry rules

Create order is not idempotent

Every successful call creates a new order. An un-issued order costs nothing, but check the order status before creating another for the same customer.

Issue is idempotent

Once an order is paid, repeating issue skips the wallet and only reports the ticketing state. Re-call until status is terminal.
cancel-hold is safe to repeat too: a second call on a released order returns 409 ORDER_NOT_ON_HOLD.

Price changes

The platform never books a changed price silently. The price is re-checked when issue reserves the seats. If it changed, issue returns 409 FLIGHT_PRICE_CHANGED with errorDetails.oldTotalPrice and newTotalPrice, and nothing is charged. Search again, show the customer the new price, and create a fresh order. Always display price.total from the latest response you have, whether that’s details, change-options or the order.

Money safety

Issue statuses

HTTP 200 from issue only means the request was processed. Always check status.