Add bags & extras (JSON)
Ancillary services (a checked bag here) can be bought at two moments, with the same mechanics; list priced service offer items, then reference the chosen one:
- On an existing order: service list for the order, then a change-order accept (below).
- During the initial booking: service list for the priced offer, then include the item in create order (further down).
The order flow continues from Make a test booking; you need a confirmed order and a valid token. Every request and response was captured live against the test environment.
Step 1: List the available services
Section titled “Step 1: List the available services”POST /json/v2/orders/MX7NDN465E71/servicesThe body is an empty object:
{}The response lists every purchasable service (bags, Wi-Fi, priority boarding, and special-service requests) with per-passenger pricing per journey or segment. The offerItemId (prefixed OFI-SR-) is what you accept in step 2.
{ "data": { "services": [ { "ssrCode": "WIFI", "name": "Wifi", "type": "Other", "feeCode": "WIFI", "segmentAvailability": [ { "scope": "journey", "journeyRefId": "JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA", "passengerPricing": [ { "paxRefId": "ADT-1", "passengerType": "ADT", "amount": 8, "currency": "USD", "offerItemId": "OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8T3RoZXJ8QURULTF8V0lGSQ" } ] } ] }, { "ssrCode": "CB1", "name": "Checked Bag 1", "type": "Baggage", "feeCode": "CB1", "segmentAvailability": [ { "scope": "journey", "journeyRefId": "JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA", "passengerPricing": [ { "paxRefId": "ADT-1", "passengerType": "ADT", "amount": 35, "currency": "USD", "offerItemId": "OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE" } ] } ] } // … CB2, CB3, COB (carry-on), priority boarding, wheelchair SSRs, … elided … ] }, "error": null}We’ll buy the first checked bag, CB1 at $35.
Step 2: Accept the service offer
Section titled “Step 2: Accept the service offer”PATCH /json/v2/orders/MX7NDN465E71Same AcceptOffer change as adding a seat, without the seat block. The offerId field is required by the schema but not resolved for a-la-carte items; pass the constant OF-ANC.
{ "changes": [ { "type": "AcceptOffer", "offerItems": [ { "offerId": "OF-ANC", "offerItemId": "OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE", "passengerIds": ["ADT-1"] } ] } ], "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 bag joins services as a confirmed item; the order (which already had a $14 seat from the previous walkthrough) totals $108 with a third payment:
{ "data": { "order": { "orderId": "MX7NDN465E71", "statusCode": "CONFIRMED", "balanceDue": { "amount": 0, "currency": "USD" }, "totalPrice": { "total": { "amount": 108, "currency": "USD" } // … base and taxes elided … } }, "services": [ { "code": "SEAT", "name": "24D", "statusCode": "CONFIRMED" /* … */ }, { "itemId": "OOI-SR-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fFBBWC1RVVJVTFRFfENCMQ", "code": "CB1", "name": "CB1", "category": "service", "statusCode": "CONFIRMED", "totalPrice": { "total": { "amount": 35, "currency": "USD" }, "base": { "amount": 0, "currency": "USD" }, "taxes": [], "fees": [ { "type": "ServiceFee", "code": "CB1", "amount": { "amount": 35, "currency": "USD" } } ] }, "paxRefId": "ADT-1", "segmentRefIds": ["SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA"] } ], "payments": [ { "amount": { "amount": 59, "currency": "USD" }, "statusCode": "SUCCESSFUL" }, { "amount": { "amount": 14, "currency": "USD" }, "statusCode": "SUCCESSFUL" }, { "amount": { "amount": 35, "currency": "USD" }, "statusCode": "PENDING" } ] // … pax, contacts, journeys elided … }, "error": null}A payment may read PENDING right after the change; retrieve the order and it flips to SUCCESSFUL.
Adding a bag during the initial booking
Section titled “Adding a bag during the initial booking”The same service list exists for a priced offer, before any order, so a booking can be created with its bags in one shot.
1. List services for the priced offer (after price offer, before create):
POST /json/v2/offers/OF-3f2f49c5-e560-4f0e-b37c-b80cb8c8cd27/services{ "offerItemIds": ["OFI-3f2f49c5-e560-4f0e-b37c-b80cb8c8cd27-0"], "passengers": [ { "paxId": "ADT-1", "type": "ADT" } ]}The response is the same services shape as the order-scoped call above; capture the chosen offerItemId (OFI-SR-…).
2. Include the service item in create order. Add it to offerItemIds and offerItemSelections next to the fare item, and pay the combined total ($59 fare + $35 bag):
{ "offerId": "OF-3f2f49c5-e560-4f0e-b37c-b80cb8c8cd27", "offerItemIds": [ "OFI-3f2f49c5-e560-4f0e-b37c-b80cb8c8cd27-0", "OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE" ], "offerItemSelections": [ { "offerItemId": "OFI-3f2f49c5-e560-4f0e-b37c-b80cb8c8cd27-0", "passengerIds": ["ADT-1"] }, { "offerItemId": "OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE", "passengerIds": ["ADT-1"] } ], "passengers": [ { "passengerId": "ADT-1", "type": "ADT", "name": { "givenName": "Sara", "surname": "Doe" }, "dateOfBirth": "1980-01-01", "gender": "Female" } ] // … contacts and payment exactly as in Make a test booking …}The passengerId on a service selection must match the paxRefId the service was priced for. Seat and service items combine freely in one create; this capture booked fare + seat + bag together for a $108 order, everything CONFIRMED from the start.
- You can accept several offer items atn once. Put multiple entries in
offerItemsand pay the combined balance. - Duplicate services are rejected by the reservation system (one WIFI per passenger per journey, one CB1, and so on). The failed change will surface; re-query the service list before retrying.
Full schema reference: order ancillaries and change order.