Add bags & extras (XML)
Ancillary services (a checked bag here) can be bought at two moments, with the same mechanics — ServiceList returns priced service offer items, and the chosen item is referenced in the committing call:
- On an existing order —
ServiceListwith anOrderRequest, thenOrderChange(below). - During the initial booking —
ServiceListwith anOfferRequestagainst the priced offer, then include the item inOrderCreate(further down).
The order flow continues from Make a test booking — you need a confirmed order and a valid token. Examples were captured live on v21.3; v25.4 is identical apart from the URL segment and the response <VersionNumber>.
Step 1 — ServiceList — list the available services
POST /ndc/v21.3/ServiceList
Same shape as SeatAvailability — for an existing order, ServiceListCoreRequest takes an OrderRequest:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_ServiceListRQ xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<DistributionChain>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>1</Ordinal>
<OrgRole>Seller</OrgRole>
<ParticipatingOrg>
<OrgID>BZ</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>2</Ordinal>
<OrgRole>Carrier</OrgRole>
<ParticipatingOrg>
<OrgID>MX</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
</DistributionChain>
<Request>
<Pax xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<PaxID>ADT-1</PaxID>
<PTC>ADT</PTC>
</Pax>
<ServiceListCoreRequest xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OrderRequest>
<Order>
<OrderID>MXYTG780SE6I</OrderID>
<OwnerCode>MX</OwnerCode>
</Order>
</OrderRequest>
</ServiceListCoreRequest>
</Request>
</IATA_ServiceListRQ>
The response's ALaCarteOffer lists one OfferItem per service, passenger, and journey/segment (OFI-SR- prefix), each priced via UnitPrice. DataLists.ServiceDefinitionList names each service — ServiceCode is the SSR code:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_ServiceListRS xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<Response>
<ALaCarteOffer xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OfferID>ALC-SR-T1J8TVhZVEc3ODBTRTZJ</OfferID>
<OfferItem>
<Eligibility>
<OfferFlightAssociations>
<PaxJourneyRef>
<PaxJourneyRefID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyRefID>
</PaxJourneyRef>
</OfferFlightAssociations>
<PaxRefID>ADT-1</PaxRefID>
</Eligibility>
<OfferItemID>OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE</OfferItemID>
<Service>
<ServiceDefinitionRefID>SD-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxDQjE</ServiceDefinitionRefID>
<ServiceID>SVC-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE</ServiceID>
</Service>
<UnitPrice>
<TotalAmount CurCode="USD">35.00</TotalAmount>
</UnitPrice>
</OfferItem>
<!-- CB2, CB3, carry-on, Wi-Fi, priority boarding, wheelchair SSRs, … elided -->
</ALaCarteOffer>
<DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<ServiceDefinitionList>
<ServiceDefinition>
<Name>Checked Bag 1</Name>
<OwnerCode>MX</OwnerCode>
<ServiceCode>CB1</ServiceCode>
<ServiceDefinitionAssociation>
<BaggageAllowanceRef>
<BaggageAllowanceRefID>BAG-Q0Ix</BaggageAllowanceRefID>
</BaggageAllowanceRef>
</ServiceDefinitionAssociation>
<ServiceDefinitionID>SD-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxDQjE</ServiceDefinitionID>
</ServiceDefinition>
<!-- remaining service definitions and BaggageAllowanceList elided -->
</ServiceDefinitionList>
</DataLists>
</Response>
<PayloadAttributes>
<Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T15:28:35.118Z</Timestamp>
<VersionNumber xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">21.3</VersionNumber>
</PayloadAttributes>
</IATA_ServiceListRS>
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 — OrderChange — accept the service offer
POST /ndc/v21.3/OrderChange
Same AcceptSelectedQuotedOfferList as a seat, without SelectedSeat:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderChangeRQ xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<DistributionChain>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>1</Ordinal>
<OrgRole>Seller</OrgRole>
<ParticipatingOrg>
<OrgID>BZ</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>2</Ordinal>
<OrgRole>Carrier</OrgRole>
<ParticipatingOrg>
<OrgID>MX</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
</DistributionChain>
<Request>
<ChangeOrderChoice xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<AcceptSelectedQuotedOfferList>
<SelectedPricedOffer>
<OfferRefID>ALC-SR-T1J8TVhZVEc3ODBTRTZJ</OfferRefID>
<SelectedOfferItem>
<OfferItemRefID>OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE</OfferItemRefID>
<PaxRefID>ADT-1</PaxRefID>
</SelectedOfferItem>
</SelectedPricedOffer>
</AcceptSelectedQuotedOfferList>
</ChangeOrderChoice>
<Order xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OrderID>MXYTG780SE6I</OrderID>
<OwnerCode>MX</OwnerCode>
</Order>
<PaymentFunctions xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<PaymentProcessingDetails>
<Amount CurCode="USD">35.00</Amount>
<Payer>
<PayerName>
<IndividualName>
<GivenName>John</GivenName>
<Surname>Doe</Surname>
</IndividualName>
</PayerName>
<PaymentAddress>
<PostalAddress>
<CityName>Los Angeles</CityName>
<CountryCode>US</CountryCode>
<CountrySubDivisionName>California</CountrySubDivisionName>
<PostalCode>90210</PostalCode>
<StreetText>123 Main St</StreetText>
</PostalAddress>
</PaymentAddress>
</Payer>
<PaymentMethod>
<PaymentCard>
<CardBrandCode>VI</CardBrandCode>
<CardNumber>4111111111111111</CardNumber>
<CardSecurityCode>123</CardSecurityCode>
<ExpirationDate>1227</ExpirationDate>
</PaymentCard>
</PaymentMethod>
</PaymentProcessingDetails>
</PaymentFunctions>
</Request>
</IATA_OrderChangeRQ>
The response is the updated IATA_OrderViewRS. The bag appears as its own OrderItem (OOI-SR- prefix); the order (which already had a $14 seat from the previous walkthrough) totals $108:
<OrderItem>
<OrderItemID>OOI-SR-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fFBBWC1RVVJVTFRFfENCMQ</OrderItemID>
<OwnerCode>MX</OwnerCode>
<Price>
<BaseAmount CurCode="USD">0</BaseAmount>
<Fee>
<Amount CurCode="USD">35</Amount>
<DesigText>CB1</DesigText>
</Fee>
<TotalAmount CurCode="USD">35</TotalAmount>
</Price>
<Service>
<BookingRef>
<BookingEntity>
<Carrier>
<AirlineDesigCode>MX</AirlineDesigCode>
</Carrier>
</BookingEntity>
<BookingID>JE88TR</BookingID>
<BookingRefTypeCode>6</BookingRefTypeCode>
</BookingRef>
<DeliveryStatusCode>CONFIRMED</DeliveryStatusCode>
<OrderServiceAssociation>
<ServiceDefinitionRef>
<OrderFlightAssociations>
<PaxSegmentRef>
<PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID>
</PaxSegmentRef>
</OrderFlightAssociations>
<ServiceDefinitionRefID>SD-SR-QnxDQjE</ServiceDefinitionRefID>
</ServiceDefinitionRef>
</OrderServiceAssociation>
<PaxRefID>ADT-1</PaxRefID>
<ServiceID>SVC-SR-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fFBBWC1RVVJVTFRFfENCMQ</ServiceID>
<StatusCode>CONFIRMED</StatusCode>
</Service>
<StatusCode>ACTIVE</StatusCode>
</OrderItem>
A PaymentProcessingSummary 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 OfferPrice, before OrderCreate). The request is the one from step 1 with OfferRequest in place of OrderRequest:
<ServiceListCoreRequest xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OfferRequest>
<Offer>
<OfferID>OF-96a92874-fcbc-43bd-8c68-b1e95e88156d</OfferID>
<OfferItem>
<OfferItemID>OFI-96a92874-fcbc-43bd-8c68-b1e95e88156d-0-ADT</OfferItemID>
<PaxRefID>ADT-1</PaxRefID>
</OfferItem>
<OwnerCode>MX</OwnerCode>
</Offer>
</OfferRequest>
</ServiceListCoreRequest>
The response is the same ALaCarteOffer + ServiceDefinitionList shape as the order-scoped call above — capture the chosen OfferItemID (OFI-SR-…).
2. Include the service item in OrderCreate. Add another SelectedOfferItem under the same SelectedPricedOffer, and pay the combined total. Seat and service items combine freely — this capture booked fare + seat + bag together for a $108 order:
<CreateOrder xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<AcceptSelectedQuotedOfferList>
<SelectedPricedOffer>
<OfferRefID>OF-96a92874-fcbc-43bd-8c68-b1e95e88156d</OfferRefID>
<OwnerCode>MX</OwnerCode>
<SelectedOfferItem>
<OfferItemRefID>OFI-96a92874-fcbc-43bd-8c68-b1e95e88156d-0-ADT</OfferItemRefID>
<PaxRefID>ADT-1</PaxRefID>
</SelectedOfferItem>
<SelectedOfferItem>
<OfferItemRefID>OFI-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fEFEVC0xfDI0RQ</OfferItemRefID>
<PaxRefID>ADT-1</PaxRefID>
</SelectedOfferItem>
<SelectedOfferItem>
<OfferItemRefID>OFI-SR-SnwxfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDR8QmFnZ2FnZXxBRFQtMXxDQjE</OfferItemRefID>
<PaxRefID>ADT-1</PaxRefID>
</SelectedOfferItem>
</SelectedPricedOffer>
</AcceptSelectedQuotedOfferList>
</CreateOrder>
The PaxRefID on a service item must match the passenger the service was priced for — use the same PaxID values (ADT-1, ADT-2, …) from AirShopping through OrderCreate so they line up. The response is the usual IATA_OrderViewRS: the order arrives OPENED with the bag as its own OOI-SR- order item, everything CONFIRMED from the start.
Notes
- Several
SelectedOfferItementries can be submitted at once, which also allows a single payment transaction for multiple items. - Only BOO-generated
OFI-SR-*IDs are accepted; SSR codes or client-built IDs are rejected withERR-1004. - Duplicate services are rejected by the reservation system (one WIFI per passenger per journey, one CB1, and so on). Re-query ServiceList before retrying.
Full schema reference: ServiceList and OrderChange.