Seat Maps and Booking
The Seats API supports the optional selection and booking of free seats for both GDS and NDC content. You can add seats as part of the AirReservation workflow after the Add Offer and Add Traveler steps, or you can add them to an existing reservation before ticketing.
This topic details the seat map request and response, which returns seat availability maps for one or more flights per the request, and the seat booking request and response, which adds a seat selection to the reservation workbench.
For a listing of the objects in the requests and responses, see the Seats API Reference.
In this topic:
Seats Workflow
Seats Workflow at Booking
When selecting seats as part of the initial reservation, send the seat map and booking request after adding the offer and traveler, before committing the workbench:
- Create a reservation workbench (this and following unlinked steps are part of the AirReservation workflow).
- Add offer.
- Add traveler.
- Send a seat map request per below.
- Send a seat book request with the selected seat/s per below. For NDC, repeat this step as needed for each flight and each passenger.
- Complete the reservation workflow with optional steps as necessary, and then commit the workbench.
Post-Reservation Seats Workflow
When adding seats to an existing PNR, take the following steps:
- Create a post-commit workbench (this and following unlinked steps are part of the AirReservation workflow).
- Send a seat map request per below.
- Send a seat book request per below. For NDC, repeat this step as needed for each segment and passenger.
- Complete the reservation workflow with optional steps as necessary, and then commit the workbench.
Seat Maps
After initiating a workbench per either workflow above, you can request seat maps as follows to return seat availability. After the seat map response, you add your selected seat/s to the workbench with a seat book request described below.
Seat Map Request
The seat map request is a POST request to the following resource; see Air API Endpoints for the endpoint.
See Seats API Reference for the endpoint. The message payload includes several identifiers.
To find the value for OfferIdentifier:
- If requesting seats as part the initial booking, send the identifier returned in the Add Offer step of the AirReservation workflow. You can also view the offer identifier by retrieving workbench details.
- For an existing PNR, send the identifier value from Reservation/Offer/Identifier in the creating the workbench.
The value to send in ProductIdentifier varies for GDS and NDC:
-
For GDS, send the value from Offer/Product @id
-
For NDC, send the value from Offer/Product/Identifier @value (a system-assigned value for that offer, e.g, f69ffaa0-1665-415e-a254-18af55c983fe).
The value to send in SegmentSequence varies for GDS and NDC:
-
For GDS, send one or more flight numbers. The request supports multiple flights on one leg.
- For NDC, send the sequence number for the flight. The request supports one flight per request.
Both GDS and NDC seat map requests are provided below.

The following example is from Seats 21.9.2. For GDS only, you can request seat maps for all flights by including multiple flight numbers in SegmentSequence.
{
"CatalogOfferingsQuerySeatAvailability": {
"SeatAvailabilityOfferings": {
"@type": "SeatAvailabilityOfferingsBuildFromReservationWorkbench",
"BuildFromReservationWorkbench": {
"ReservationIdentifier": {
"Identifier": {
"authority": "Travelport",
"value": "1846bdcc-f86f-4134-a847-2e52412b20c4"
}
},
"OfferIdentifier": {
"Identifier": {
"authority": "Travelport",
"value": "44176fc3-b353-4a22-a361-827398250587"
}
},
"ProductIdentifier": [
{
"Identifier": {
"value": "p0"
}
}
],
"SegmentSequence": [
870,
1400
]
}
}
}
}

For an NDC seat map request, use the following format and send only one flight sequence number in SegmentSequence. Repeat the request as needed for additional flights.
{
"CatalogOfferingsQuerySeatAvailability": {
"SeatAvailabilityOfferings": {
"@type": "SeatAvailabilityOfferingsBuildFromReservationWorkbench",
"BuildFromReservationWorkbench": {
"ReservationIdentifier": {
"Identifier": {
"authority": "Travelport",
"value": "bc2305f1-8846-44b5-b685-ca8e1091c723"
}
},
"OfferIdentifier": {
"Identifier": {
"authority": "QF",
"value": "WDJFMjc1NUM1LTY0NjgtNDk1Qi05QzNGMS0xfFgyRTI3NTVDNS02NDY4LTQ5NUItOUMzRnwyMDIxLTA0LTA
5VDE2OjM5OjU2fEFEVDpYMkUyNzU1QzUtNjQ2OC00OTVCLTlDM0YxLTEtMXxRRnxSRUQ="
}
},
"ProductIdentifier": [
{
"Identifier": {
"value": "dfc98cf2-eca7-4f29-acb9-cc9571d4c743"
}
}
],
"SegmentSequence": [
1
]
}
}
}
}
Seat Map Response
The response returns basic flight and traveler details, and a list of all seats grouped by availability status (Available, Reserved, etc.). The response consolidates information across those seats into the ReferenceList object, which lists for each row all seat numbers and the characteristics for each seat.
In Seats 21.9.3 and later, both NDC and GDS seat map responses also return trace and transaction IDs.
In the follow-on Seat Book request, you need to send the value in CatalogOfferingsAncillaryListResponse/Identifier, which is returned just before the ReferenceList object.
Although the Seat Map response indicates both paid and free seats, booking paid seats is not supported on Seats v9.

The following example excerpt for GDS is from Seats 21.9.2 and returns a seat map of free seats for each of two requested flights. The seat map for each flight is returned in its own instance of CatalogOffering.
For brevity, this example omits the Traveler and ReferenceList objects, and truncates long seat lists. For full-length examples, see the Developer Toolkits on the Tools page.
{
"CatalogOfferingsAncillaryListResponse": {
"CatalogOfferingsID": [
{
"@type": "CatalogOfferingsTravelerFlight",
"Identifier": {
"value": "ab0e768e-bf25-4923-b26e-9ec346a141cb"
},
"CatalogOffering": [
{
"@type": "CatalogOffering",
"id": "ancillaryID_1",
"ProductOptions": [
{
"@type": "ProductOptions",
"Product": [
{
"@type": "ProductSeatAvailability",
"id": "productSeatID_1",
"SeatAvailability": [
{
"seatAvailabilityStatus": "Available",
"value": [
"17A",
"17B",
"17C",
"17D",
"17E",
"17F",
...
]
},
{
"seatAvailabilityStatus": "NoSeat",
"value": [
"27D",
"27E",
"27F",
"28D",
"28E",
"28F",
"41A",
"41B",
"41C",
"41J",
"41K",
"41L"
]
},
{
"seatAvailabilityStatus": "Reserved",
"value": [
"16D",
"16E",
"38J",
"38K",
"38L",
"39A",
"39B",
"39C",
"39D",
"39E"
]
},
{
"seatAvailabilityStatus": "Blocked",
"value": [
"16A",
"16B",
"16C",
"16F",
"16J",
"16K",
"16L",
"28A",
"28B",
"28C",
"28J",
"28K",
...
]
}
],
"SeatingChartRef": "seatingChart_1"
}
]
}
]
}
],
<< Traveler object omitted >>
"Flight": {
"@type": "Flight",
"carrier": "UA",
"number": "0870",
"id": "s1",
"Departure": {
"@type": "Departure",
"location": "SYD",
"date": "2021-09-09"
},
"Arrival": {
"@type": "Arrival",
"location": "SFO"
}
}
},
{
"@type": "CatalogOfferingsTravelerFlight",
"Identifier": {
"value": "cf21822d-bfdb-4b10-9d24-400d3a508080"
},
"CatalogOffering": [
{
"@type": "CatalogOffering",
"id": "ancillaryID_2",
"ProductOptions": [
{
"@type": "ProductOptions",
"Product": [
{
"@type": "ProductSeatAvailability",
"id": "productSeatID_2",
"SeatAvailability": [
{
"seatAvailabilityStatus": "Available",
"value": [
"8D",
"8E",
"8F",
"9A",
"9B",
"9C",
"9D",
"9E",
"9F",
"10A",
"10B",
"10C",
"10D",
"10E",
"10F",
"11A",
"11B",
"11C",
"11D",
"11E",
"11F",
...
]
},
{
"seatAvailabilityStatus": "NoSeat",
"value": [
"7A",
"7B",
"7C"
]
},
{
"seatAvailabilityStatus": "Reserved",
"value": [
"7D",
"7E",
"23B",
"23C",
"25B",
"25C"
]
},
{
"seatAvailabilityStatus": "Blocked",
"value": [
"7F",
"8A",
"8B",
"8C",
"14A",
"14B",
"14C",
"14D",
"14E",
"14F",
"15A",
"15B",
"15C",
"15D",
"15E",
...
]
}
],
"SeatingChartRef": "seatingChart_2"
}
]
}
]
}
],
<< Traveler object omitted >>
"Flight": {
"@type": "Flight",
"carrier": "UA",
"number": "1400",
"id": "s2",
"Departure": {
"@type": "Departure",
"location": "SFO",
"date": "2021-09-09"
},
"Arrival": {
"@type": "Arrival",
"location": "ORD"
}
}
}
],
"Identifier": {
"value": "e90ccd38-5310-4cd3-bb85-858ffe6780g9"
},
<< ReferenceList omitted >>
}
}

The following example excerpt is from Seats 21.9.2 and returns all seats, both free and paid, for NDC. The NDC response returns separate instances of CatalogOffering, each of which includes all seats at the same price point. This example returns three instances of CatalogOffering with seats at three prices: 0, 10, and 30.
The response consolidates row and seat details across flights in the ReferenceList object. For brevity, this example omits the Traveler and ReferenceList objects, and truncates long seat lists. For full-length examples, see the Developer Toolkits on the Tools page.
{
"CatalogOfferingsAncillaryListResponse": {
"transactionId": "05c24ace-2d52-2a6a-faef-e7a46d0aff75",
"traceId": "NoTrace",
"CatalogOfferingsID": [
{
"@type": "CatalogOfferingsTravelerFlight",
"Identifier": {
"authority": "Travelport",
"value": "8fc84490-1354-42ec-a964-8adf0465610f"
},
"DefaultCurrency": {
"code": "AUD"
},
"CatalogOffering": [
{
"@type": "CatalogOffering",
"Identifier": {
"authority": "Travelport",
"value": "2dc595f4-f867-4e09-acfa-5f9b070b6301"
},
"ProductOptions": [
{
"@type": "ProductOptions",
"Product": [
{
"@type": "ProductSeatAvailability",
"SeatAvailability": [
{
"seatAvailabilityStatus": "Available",
"value": [
"18C",
"18D",
"18E",
"18F",
"19A",
"19B",
"19C",
"19D",
"19E",
"19F",
"20A",
"20B",
"20C",
"20D",
"20E",
"20F",
"21A",
"21B",
"21C",
"21D",...
]
},
{
"seatAvailabilityStatus": "Blocked",
"value": [
"4A",
"4B",
"4C",
"4D",
"4E",
"4F",
"5A",
"5B",
"5C",
"5D",
"5E",
"5F",
"6A",
"6B",
"6C",
"6D",
"6E",
"6F",
"7A",
"7B",
"7C",
"7D",
"7E",
"7F",
"8A",
"8B",
"8C",
"8D",
"8E",
"8F",
"10A",
"10B",
"10C",
"10D",
"10E",
"10F",
"11A",
"11B",
"11C",
"11D",
"11E",
"11F",
"12A",
"12B",
"12C",
"12D",
"12E",
"12F",
"15A",
"15B",
"15C",
"15D",
"15E",
"15F",
...
]
},
{
"seatAvailabilityStatus": "Reserved",
"value": [
"18A",
"18B",
"27D"
]
}
],
"Brand": {
"@type": "Brand",
"name": "SEAT ASSIGNMENT"
},
"SeatingChartRef": "seatingChart_1"
}
]
}
],
"Price": {
"@type": "Price",
"currencyCode": "AUD",
"id": "WF40ECFCC-73FC-46A5-9D62-1-1",
"Base": 0,
"TotalPrice": 0
}
},
{
"@type": "CatalogOffering",
"Identifier": {
"authority": "Travelport",
"value": "6c870f7e-0ffc-4dea-8926-35834937e9fd"
},
"ProductOptions": [
{
"@type": "ProductOptions",
"Product": [
{
"@type": "ProductSeatAvailability",
"SeatAvailability": [
{
"seatAvailabilityStatus": "Available",
"value": [
"13A",
"13B",
"13C",
"13D",
"13E",
"13F",
"14A",
"14B",
"14C",
"14E",
"14F"
]
},
{
"seatAvailabilityStatus": "Reserved",
"value": [
"14D"
]
}
],
"Brand": {
"@type": "Brand",
"name": "EXTRA LEGROOM"
},
"SeatingChartRef": "seatingChart_1"
}
]
}
],
"Price": {
"@type": "Price",
"currencyCode": "AUD",
"id": "WF40ECFCC-73FC-46A5-9D62-1-2",
"Base": 27.27,
"TotalPrice": 30
}
},
{
"@type": "CatalogOffering",
"Identifier": {
"authority": "Travelport",
"value": "ba7fee59-3519-4826-a7d1-3c53a3fab269"
},
"ProductOptions": [
{
"@type": "ProductOptions",
"Product": [
{
"@type": "ProductSeatAvailability",
"SeatAvailability": [
{
"seatAvailabilityStatus": "Available",
"value": [
"9A",
"9B",
"9C",
"9D",
"9E",
"9F"
]
}
],
"Brand": {
"@type": "Brand",
"name": "PREFERRED SEAT"
},
"SeatingChartRef": "seatingChart_1"
}
]
}
],
"Price": {
"@type": "Price",
"currencyCode": "AUD",
"id": "WF40ECFCC-73FC-46A5-9D62-1-3",
"Base": 9.09,
"TotalPrice": 10
}
}
],
"Identifier": {
"value": "736f3da4-c253-4732-833c-c51100de7563"
}, <<ReferenceList omitted>>
Seat Booking
After requesting seat maps per above to return seat availability, use the seat book request described next to add any available free seat to the workbench.
Seat Book Request
The message payload includes several identifiers. See the Seats API Reference. for endpoints and a full listing.
The seat booking request differs slightly between GDS and NDC:
-
The TravelerIdentifier object is required for GDS but not for NDC.
-
The GDS seat book request supports multiple seat bookings in a single request. NDC supports only one seat booking in a single request; you must send a separate request for each seat assignment choice for each traveler.
Each instance of BuildAncillaryOffersFromCatalogOfferingsAirSeat must include the following values:
- CatalogOfferingsIdentifier value from the seat map response (note the s)
- CatalogOfferingIdentifier value from the seat map response (no s) (not required for NDC)
- TravelerIdentifier (not required for NDC)
- SeatAssignment choice

The example message payload below from Seats 21.9.2 for GDS sends a request to select seats for the same traveler on two flights. Each instance of BuildAncillaryOffersFromCatalogOfferingsAirSeat includes one seat request for one traveler.
{
"OfferQueryBuildAncillaryOffersFromCatalogOfferings": {
"BuildAncillaryOffersFromCatalogOfferings": [
{
"@type": "BuildAncillaryOffersFromCatalogOfferingsAirSeat",
"CatalogOfferingsIdentifier": {
"Identifier": {
"value": "e90ccd38-5310-4cd3-bb85-858ffe6787f1"
}
},
"CatalogOfferingIdentifier": {
"Identifier": {
"value": "ab0e768e-bf25-4923-b26e-9ec346a141cb"
}
},
"TravelerIdentifier": {
"Identifier": {
"authority": "Travelport",
"value": "7e46fb72-77e5-4306-9f71-fbe2b5ebcaa0"
}
},
"SeatAssignment": "41F"
},
{
"@type": "BuildAncillaryOffersFromCatalogOfferingsAirSeat",
"CatalogOfferingsIdentifier": {
"Identifier": {
"value": "e90ccd38-5310-4cd3-bb85-858ffe6787f1"
}
},
"CatalogOfferingIdentifier": {
"Identifier": {
"value": "cf21822d-bfdb-4b10-9d24-400d3a508080"
}
},
"TravelerIdentifier": {
"Identifier": {
"authority": "Travelport",
"value": "7e46fb72-77e5-4306-9f71-fbe2b5ebcaa0"
}
},
"SeatAssignment": "8D"
}
]
}
}

In the v9 NDC seat book request, CatalogOfferingIdentifier and TravelerIdentifier are not required. Send one request per each traveler and each flight.
{
"OfferQueryBuildAncillaryOffersFromCatalogOfferings": {
"BuildAncillaryOffersFromCatalogOfferings": [
{
"@type": "BuildAncillaryOffersFromCatalogOfferingsAirSeat",
"CatalogOfferingsIdentifier": {
"Identifier": {
"value": "2dc595f4-f867-4e09-acfa-5f9b070b6301"
}
},
"SeatAssignment": "27F"
}
]
}
}
Seat Book Response
The seat book response is the same for both GDS and NDC and returns an identifier for the transaction. In Seats 21.9.3 and later, both NDC and GDS responses also return trace and transaction IDs.

The following example from Seats 21.9.3 shows the trace and transaction IDs.
{
"OfferListResponse": {
"transactionId": "330a242c-2d9a-4955-a5b1-60924253e076",
"traceId": "29110e39-c5bf-4fbb-9b5f-4d7756fc4879",
"OfferID": [
{
"@type": "OfferIdentifier",
"Identifier": {
"value": "4d1c7fcf-6e83-4d8b-a4e2-6de945dadba3"
}
}
]
}
}
Commit
After adding seats to the workbench, complete any remaining optional steps in the workflow. The last step in both workflows is to commit the workbench per the AirReservation Workflow.
If the seat book request is not confirmed, the commit returns an error message with status code 1005 along with the error message "Error while invoking : Could not find Seat connector".