Add seats (XML)
Seats can be bought at two moments, with the same mechanics; SeatAvailability returns priced seat offer items, and the chosen item is referenced in the committing call:
- On an existing order:
SeatAvailabilitywith anOrderRequest, thenOrderChange(below). - During the initial booking:
SeatAvailabilitywith anOfferRequestagainst the priced offer, then include the seat 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: SeatAvailability (get the seat map)
Section titled “Step 1: SeatAvailability (get the seat map)”POST /ndc/v21.3/SeatAvailabilityFor an existing order, SeatAvailCoreRequest takes an OrderRequest (post-booking) instead of the pre-booking OfferRequest:
<?xml version="1.0" encoding="UTF-8"?><IATA_SeatAvailabilityRQ 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> <SeatAvailCoreRequest xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes"> <OrderRequest> <Order> <OrderID>MXYTG780SE6I</OrderID> <OwnerCode>MX</OwnerCode> </Order> </OrderRequest> </SeatAvailCoreRequest> </Request></IATA_SeatAvailabilityRQ>The response has two halves:
ALaCarteOffer: oneOfferItemper open seat and passenger, with anOfferItemIDprefixedOFI-ST-and aUnitPrice. Capture the a-la-carteOfferIDand the seat’sOfferItemIDfor step 2.SeatMap: the cabin per segment:CabinCompartment→SeatRow→Seatwith occupation status and characteristic codes.
<?xml version="1.0" encoding="UTF-8"?><IATA_SeatAvailabilityRS 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-ST-T1J8TVhZVEc3ODBTRTZJ</OfferID> <OfferItem> <Eligibility> <OfferFlightAssociations> <PaxSegmentReferences> <PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID> </PaxSegmentReferences> </OfferFlightAssociations> <PaxRefID>ADT-1</PaxRefID> </Eligibility> <OfferItemID>OFI-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fEFEVC0xfDI0RA</OfferItemID> <Service> <ServiceDefinitionRefID>SD-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fDI0RA</ServiceDefinitionRefID> <ServiceID>SVC-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fEFEVC0xfDI0RA</ServiceID> </Service> <UnitPrice> <TotalAmount CurCode="USD">14.00</TotalAmount> </UnitPrice> </OfferItem> <!-- one OfferItem per remaining open seat elided --> </ALaCarteOffer> <DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes"> <!-- ServiceDefinitionList (one entry per seat, e.g. "Seat 24D"), SeatProfileList (legroom tiers) elided --> </DataLists> <SeatMap xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes"> <CabinCompartment> <CabinCompartmentID>Y</CabinCompartmentID> <DeckCode>Main</DeckCode> <SeatRow> <RowNumber>24</RowNumber> <Seat> <ColumnID>D</ColumnID> <OccupationStatusCode>F</OccupationStatusCode> <RowNumber>24</RowNumber> <SeatCharacteristicCode>A</SeatCharacteristicCode> <SeatCharacteristicCode>RS</SeatCharacteristicCode> <SeatProfileRefID>SP-PITCH-31</SeatProfileRefID> </Seat> <!-- remaining seats in the row elided --> </SeatRow> <!-- remaining rows elided --> </CabinCompartment> </SeatMap> </Response> <PayloadAttributes> <Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T15:27:31.402Z</Timestamp> <VersionNumber xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">21.3</VersionNumber> </PayloadAttributes></IATA_SeatAvailabilityRS>We’ll take seat 24D at $14. The OFI-ST- ID carries identity only (segment, passenger, seat); the price is recomputed from live booking state when accepted.
Step 2: OrderChange (accept the seat offer)
Section titled “Step 2: OrderChange (accept the seat offer)”POST /ndc/v21.3/OrderChangeAcceptSelectedQuotedOfferList references the a-la-carte offer and seat item, SelectedSeat names the row and column, and PaymentFunctions pays the new balance:
<?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-ST-T1J8TVhZVEc3ODBTRTZJ</OfferRefID> <SelectedOfferItem> <OfferItemRefID>OFI-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fEFEVC0xfDI0RA</OfferItemRefID> <PaxRefID>ADT-1</PaxRefID> <SelectedSeat> <SeatRowNumber>24</SeatRowNumber> <ColumnID>D</ColumnID> </SelectedSeat> </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">14.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 seat appears as its own OrderItem (OOI-ST- prefix) with a SeatOnLeg association, and the order total grows to $73:
<OrderItem> <OrderItemID>OOI-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fFBBWC1RVVJVTFRFfFNFQVR8MjRE</OrderItemID> <OwnerCode>MX</OwnerCode> <Price> <BaseAmount CurCode="USD">0</BaseAmount> <Fee> <Amount CurCode="USD">14</Amount> <DesigText>SEAT</DesigText> </Fee> <TotalAmount CurCode="USD">14</TotalAmount> </Price> <Service> <BookingRef> <BookingEntity> <Carrier> <AirlineDesigCode>MX</AirlineDesigCode> </Carrier> </BookingEntity> <BookingID>JE88TR</BookingID> <BookingRefTypeCode>6</BookingRefTypeCode> </BookingRef> <DeliveryStatusCode>CONFIRMED</DeliveryStatusCode> <OrderServiceAssociation> <SeatOnLeg> <Seat> <ColumnID>D</ColumnID> <RowNumber>24</RowNumber> </Seat> <SeatAssignmentAssociations> <PaxSegmentRef> <PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID> </PaxSegmentRef> </SeatAssignmentAssociations> </SeatOnLeg> </OrderServiceAssociation> <PaxRefID>ADT-1</PaxRefID> <ServiceID>SVC-ST-U3xQVlVTTkF8MjAyNjA5MTV8TVgxNjQ0fFBBWC1RVVJVTFRFfFNFQVR8MjRE</ServiceID> <StatusCode>CONFIRMED</StatusCode> </Service> <StatusCode>ACTIVE</StatusCode> </OrderItem>Adding a seat during the initial booking
Section titled “Adding a seat during the initial booking”The same seat map exists for a priced offer, before any order, so a booking can be created with its seat in one shot.
1. Get the seat map for the priced offer (after OfferPrice, before OrderCreate). The request is the one from step 1 with OfferRequest in place of OrderRequest:
<SeatAvailCoreRequest 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> </SeatAvailCoreRequest>The response is the same ALaCarteOffer + SeatMap shape as the order-scoped call above; pick the seat and capture its OfferItemID (OFI-ST-…).
2. Include the seat item in OrderCreate. Add a second SelectedOfferItem under the same SelectedPricedOffer, and pay the combined total ($59 fare + $14 seat). No SelectedSeat element is needed; the OFI-ST- ID already encodes the seat:
<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> </SelectedPricedOffer> </AcceptSelectedQuotedOfferList> </CreateOrder>A seat item takes exactly one PaxRefID, and it must match the passenger the seat 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 seat as its own OOI-ST- order item, everything CONFIRMED from the start.
- Moving to a different seat is the same call with the new seat’s
offerItemId. The swap is atomic. If allowed by rules, a portion of the previous seat fee may be credited toward the new seat. - Only BOO-generated
OFI-ST-*IDs are accepted; raw seat unit keys or client-built IDs are rejected withERR-1004. - Changes that create a positive balance require
payment. A held (unpaid) order can accept updates which increases the balance due. - If the seat was reserved by a different session between the seat map call and its selection, the change is rejected. Retrieve the seat map for current availability and try again.
Full schema reference: SeatAvailability and OrderChange.