Skip to main content

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 orderServiceList with an OrderRequest, then OrderChange (below).
  • During the initial bookingServiceList with an OfferRequest against the priced offer, then include the item in OrderCreate (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:

IATA_ServiceListRQ
<?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:

IATA_ServiceListRS — 200 OK (trimmed to the first checked bag)
<?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.

Bags are a ladder

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:

IATA_OrderChangeRQ
<?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:

IATA_OrderViewRS — 200 OK (bag order item)
<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:

IATA_ServiceListRQ (ServiceListCoreRequest excerpt)
<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:

IATA_OrderCreateRQ (CreateOrder excerpt)
<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 SelectedOfferItem entries 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 with ERR-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.