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
POST /json/v2/orders/MX7NDN465E71/services
The 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.
Checked bags are tiered per passenger per journey: CB1 is the first bag, CB2 the second, CB3 the third. Buy them in order — accepting CB2 while the passenger holds no CB1 on that journey is rejected.
Step 2 — Accept the service offer
PATCH /json/v2/orders/MX7NDN465E71
Same 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
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" }
]
}
Service offer item IDs are scoped to a passenger, so the passengers here need paxId values. If the offer was priced with anonymous passengers ({"type": "ADT"} only) and you omit passengers in this call, the request fails with ERR-1005 ("Service price is missing stable PaxID"). Use ADT-1, ADT-2, … and keep the same IDs in create order.
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.
Notes
- 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.