Hold and pay (JSON)
Book without collecting payment, then confirm the hold later. Continues from a priced offer (steps 1 and 2 of Make a test booking).
Currency is USD; use the sandbox Visa test card when paying; see payments.
Step 1: Create on hold
Section titled “Step 1: Create on hold”POST /json/v1/ordersSame passengers and contacts as a paid create, but payment is { "type": "Hold" }:
{ "offerId": "OF-5cee97a8-d446-461b-91c6-4c9c5565ba04", "offerItemIds": ["OFI-5cee97a8-d446-461b-91c6-4c9c5565ba04-0"], "offerItemSelections": [ { "offerItemId": "OFI-5cee97a8-d446-461b-91c6-4c9c5565ba04-0", "passengerIds": ["PX1"] } ], "passengers": [ { "passengerId": "PX1", "type": "ADT", "name": { "givenName": "Jane", "surname": "Doe" }, "dateOfBirth": "1980-01-01", "gender": "Female" } ], "contact": { "phoneNumber": "8015551212" }, "payment": { "type": "Hold" }}Success returns 201 with statusCode: "ONHOLD", a paymentTimeLimit, and balanceDue equal to the order total. Capture orderId for the next steps.
{ "data": { "order": { "orderId": "MX7NDN465E71", "recordLocator": "E2BL5F", "statusCode": "ONHOLD", "paymentTimeLimit": "2026-08-18T23:59:00Z", "balanceDue": { "amount": 59, "currency": "USD" }, "totalPrice": { "total": { "amount": 59, "currency": "USD" } } }, "payments": [] }, "error": null}Step 2: Retrieve (optional)
Section titled “Step 2: Retrieve (optional)”GET /json/v1/orders/MX7NDN465E71?ownerCode=MXConfirms the hold is still open and shows the outstanding balanceDue before you pay.
Step 3: Confirm with payment
Section titled “Step 3: Confirm with payment”PATCH /json/v1/orders/MX7NDN465E71ConfirmHold plus a card payment for the balance due:
{ "changes": [{ "type": "ConfirmHold" }], "payment": { "type": "CreditCard", "cardType": "VI", "cardNumber": "4111111111111111", "expiryDate": "1227", "securityCode": "123", "payer": { "name": { "givenName": "Jane", "surname": "Doe" }, "postalAddress": { "line1": "123 Main St", "city": "Los Angeles", "stateProvince": "California", "postalCode": "90210", "countryCode": "US" } } }}The order flips to CONFIRMED with balanceDue of 0 and a successful payment row.
{ "data": { "order": { "orderId": "MX7NDN465E71", "statusCode": "CONFIRMED", "balanceDue": { "amount": 0, "currency": "USD" } }, "payments": [ { "paymentId": "PAY-MQ", "amount": { "amount": 59, "currency": "USD" }, "statusCode": "SUCCESSFUL", "method": { "type": "CreditCard", "cardBrandCode": "VI" } } ] }, "error": null}- Pay before
paymentTimeLimitor the hold expires and cannot be confirmed. - To drop a hold without paying, use
CancelUnpaidOrder; see change order. - Ancillary seats/services can be added while on hold; they increase
balanceDueand are collected when you confirm (or rejected if you try to confirm without covering the new total).
XML counterpart: Hold and pay (XML).