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
POST /ndc/v21.3/SeatAvailability
For 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
POST /ndc/v21.3/OrderChange
AcceptSelectedQuotedOfferList 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
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.
Notes
- 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.