Skip to main content

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 orderSeatAvailability with an OrderRequest, then OrderChange (below).
  • During the initial bookingSeatAvailability with an OfferRequest against the priced offer, then include the seat 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 — 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:

IATA_SeatAvailabilityRQ
<?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 — one OfferItem per open seat and passenger, with an OfferItemID prefixed OFI-ST- and a UnitPrice. Capture the a-la-carte OfferID and the seat's OfferItemID for step 2.
  • SeatMap — the cabin per segment: CabinCompartmentSeatRowSeat with occupation status and characteristic codes.
IATA_SeatAvailabilityRS — 200 OK (trimmed)
<?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:

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

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

IATA_SeatAvailabilityRQ (SeatAvailCoreRequest excerpt)
<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:

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>
</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 with ERR-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.