Implementation Guides

Adding seats

note

The ability to pick a seat is not yet available for all airlines. We recommend using an offer from American Airlines to follow along with this guide.

What do you need to start?

This guide assumes that you've build a basic "search and book" flow with the Duffel API. If you haven't done this yet, we'd recommend that you read through our Quick Start guide first.

Overview

In this guide, we'll show you how to select free or paid seats for passengers when booking flights through the Duffel API.
We'll explain how to interpret the seat map data returned in the API so you can build your own interactive seat map, allowing customers to pick their own seats.
We recommend reading through the seat maps endpoint API documentation first.

Searching for flights

To search for flights, you'll need to create an offer request. You'll get back a series of search results called offers. Each has a unique ID.
We recommend using an offer from American Airlines to follow along with this guide. To find an American Airlines offer where seat selection is available, we'd recommend searching with one slice from DFW (Dallas) to AUS (Austin), about three months from today's date. to follow along with this guide.

Requesting seat maps for an offer

Seat Maps in the Duffel API show you the layout of the plane, what seats are available and how much they cost, if anything.
You'll request seat maps in the context of an offer, using its ID. For this guide, we suggest using an offer from American Airlines. You can identify an American Airlines offer by looking at its owner attribute:
{
"owner": {
"iata_code": "AA",
"id": "arl_00009VME7DAGiJjwomhv32",
"name": "American Airlines"
}
}
You'll use the "Get seat maps" API to get the seat maps for an offer:

Curl

1
curl -X GET --compressed "https://api.duffel.com/air/seat_maps?offer_id=<ID>" \
2
-H "Accept-Encoding: gzip" \
3
-H "Accept: application/json" \
4
-H "Duffel-Version: beta" \
5
-H "Authorization: Bearer example_token"
6
The data attribute in the response will be an array with a list of seats maps. One offer can include multiple segments (i.e. flights), so we may return multiple seat maps:
{
"data": [
{
"cabins": [
{
"aisles": 2,
"cabin_class": "economy",
"deck": 0,
"rows": [
{
"sections": [
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1A",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1B",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1B",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1C",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1D",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1D",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1E",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1E",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [],
"designator": "1F",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [],
"designator": "1G",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1J",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1H",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1J",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1M",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "30.00",
"total_currency": "GBP"
}
],
"designator": "1K",
"disclosures": [],
"name": "",
"type": "seat"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "exit_row"
}
]
},
{
"elements": []
},
{
"elements": [
{
"type": "exit_row"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2A",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2B",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2B",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2C",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [],
"designator": "2D",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [],
"designator": "2E",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2F",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2F",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2G",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2G",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [],
"designator": "2H",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2J",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2J",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "20.00",
"total_currency": "GBP"
}
],
"designator": "2K",
"disclosures": [],
"name": "",
"type": "seat"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3A",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [],
"designator": "3B",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3C",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3D",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3D",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3E",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3E",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3F",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3F",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [],
"designator": "3G",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3H",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3H",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3J",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3J",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "3K",
"disclosures": [],
"name": "",
"type": "seat"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4A",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4B",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4B",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4C",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4D",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4D",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4E",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4E",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4F",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4F",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4G",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4G",
"disclosures": [],
"name": "",
"type": "seat"
}
]
},
{
"elements": [
{
"available_services": [],
"designator": "4H",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [],
"designator": "4J",
"disclosures": [],
"name": "",
"type": "seat"
},
{
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": "10.00",
"total_currency": "GBP"
}
],
"designator": "4K",
"disclosures": [],
"name": "",
"type": "seat"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "lavatory"
}
]
},
{
"elements": []
},
{
"elements": [
{
"type": "lavatory"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "galley"
}
]
},
{
"elements": [
{
"type": "galley"
}
]
},
{
"elements": [
{
"type": "galley"
}
]
}
]
}
],
"wings": {
"first_row_index": 1,
"last_row_index": 2
}
}
],
"id": "sea_00003hthlsHZ8W4LxXjkzo",
"segment_id": "seg_00009htYpSCXrwaB9Dn456",
"slice_id": "sli_00009htYpSCXrwaB9Dn123"
}
]
}
Seat selection isn't currently available for all airlines. Even for airlines that support seat selection, there may be some offers where it isn't available (for example offers that include flights from other airlines).
If seat selection isn't available, the Seat Maps API will return an empty list of seat maps. You should handle this gracefully in your integration:
{
"data": [],
"meta": null
}

Turning the Seat Maps API response into a visual seat map

Next, you'll probably use the response from the Seat Maps API to render a visual seat map, where your customers can see the available seats and their prices, and pick a seat that meets their needs.
In this step, we'll show you how to interpret that data and turn it into something beautiful, like you see in the Duffel booking tool.
The goal of this guide is to show you how to interpret the data. You can, of course, apply your own visual style.
Example seat map in the Duffel booking tool

Example seat map in the Duffel booking tool

Here's an example seat map response for an offer with a single passenger, a single slice and a single segment:
{
"data": [
{
"id": "sea_00003hthlsHZ8W4LxXjkzo",
"slice_id": "sli_00009htYpSCXrwaB9Dn123",
"segment_id": "seg_00009htYpSCXrwaB9Dn456",
"cabins": [
{
"deck": 0,
"cabin_class": "economy",
"wings": {
"first_row_index": 1,
"last_row_index": 2
},
"aisles": 2,
"rows": [
{
"sections": [
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "1A",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "1B",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1B",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "1C",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "1D",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1D",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "1E",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1E",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "1F",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "1G",
"disclosures": [],
"available_services": []
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "1H",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1J",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "1J",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "1K",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA1K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 30,
"total_currency": "GBP"
}
]
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "exit_row"
}
]
},
{
"elements": []
},
{
"elements": [
{
"type": "exit_row"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "2A",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "2B",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2B",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "2C",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "2D",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "2E",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "2F",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2F",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "2G",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2G",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "2H",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "2J",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2J",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "2K",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA2K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 20,
"total_currency": "GBP"
}
]
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "3A",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "3B",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "3C",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "3D",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3D",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "3E",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3E",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "3F",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3F",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "3G",
"disclosures": [],
"available_services": []
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "3H",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3H",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "3J",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3J",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "3K",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA3K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "4A",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4A",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "4B",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4B",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "4C",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4C",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "4D",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4D",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "4E",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4E",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "4F",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4F",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
},
{
"type": "seat",
"name": "",
"designator": "4G",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4G",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
}
]
},
{
"elements": [
{
"type": "seat",
"name": "",
"designator": "4H",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "4J",
"disclosures": [],
"available_services": []
},
{
"type": "seat",
"name": "",
"designator": "4K",
"disclosures": [],
"available_services": [
{
"id": "ase_00009UhD4ongolulWAAA4K",
"passenger_id": "pas_00009hj8USM7Ncg31cAAA",
"total_amount": 10,
"total_currency": "GBP"
}
]
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "lavatory"
}
]
},
{
"elements": []
},
{
"elements": [
{
"type": "lavatory"
}
]
}
]
},
{
"sections": [
{
"elements": [
{
"type": "galley"
}
]
},
{
"elements": [
{
"type": "galley"
}
]
},
{
"elements": [
{
"type": "galley"
}
]
}
]
}
]
}
]
}
]
}
The response includes seats in the cabin that the passenger is flying in (economy).
This cabin has 2 aisles, so there will be 3 sections in each row . We'll refer to these as the left, middle, and right sections. In the response there are 7 rows, which consist of seats and other features (which we call "elements").

tip

Rows are zero-indexed in our API. That means if you have 3 rows, the first row is at index 0, the second row at index 1, etc. In this guide, we'll refer to rows in a more "human" way (first row, second row, etc.).

Looking at our example response, a typical row has 3 seats in the left section (ABC), 4 in the middle section (DEFG), and 3 in the right section (HJK). Aircraft configurations can be complex, so keep in mind that rows could have missing seats or contain other elements such as toilets.
We'll render each row one-by-one to build up a full seat map. A row is made up of elements. Seat elements have a type attribute that says seat.
Where a seat is available, the seat element will have a list of one or more available_services attached to it. The services will contain information about the seat like the total amount it costs (which can be free!) and any disclosures (text to display about the "rules" for the seat).
Where there are multiple passengers, there will be a service per passenger with the passenger's ID, to allow for the fact that an airline might charge different prices for the same seat, depending on who the passenger is.
If a seat doesn't have an available service (represented as an empty list, []), it means that the seat is unavailable. We'll want to make that clear on our map. On our example, we can see that seats 1F and 1G are not available. Here is the first row:
First row of the seat map

First row of the seat map

You may just want to render the seat elements - this is enough for a basic seat selection experience.
However, in our seat maps we also include additional information which you can optionally use to visualise a more complete seat map and provide a better user experience. The next few rows in our example will demonstrate that.
The second row in the response is an exit row, as signified by its exit_row elements. We will render this as empty space and exit markers before the following rows of seats:
Multiple rows and exit row on the seat map

Multiple rows and exit row on the seat map

After those three rows of seats, we have a couple more rows with various non-seat elements.
The sixth row in the response has a toilet in the left section and a toilet in the right section, and empty space in the middle. We'll display this row like this:
Toilets and empty spaces on the seat map

Toilets and empty spaces on the seat map

The last row (seventh row in the response) has one galley in each section. Following the rendering suggestions in the API documentation, to fill the section, we will render it like this:
Galleys on the seat map

Galleys on the seat map

Finally, the wings data in the response shows us that the wings are positioned over the rows from 1 to 2, which ends up being the second and third rows in our rendered seat map. We can render some markers on the side of the seat map to indicate that, arriving to our complete seat map:
Full seat map

Full seat map

Creating an order with one or more seats selected

When creating an order, you'll need to pass in a list of services to refer to the seat(s) you want to book.
Looking back to our seat map, we knew that a seat was available because it had one or more available_services attached to it.
The services attribute when creating an order is a list. Each entry in the list should have an id and a quantity. The quantity will always be 1, and the ID should be the ID of the available service which corresponds to the passenger you want to book the seat for.
Looking back to our example above, if we wanted to select seat 1D for passenger pas_00009hj8USM7Ncg31cAAA, we'd use the service ID ase_00009UhD4ongolulWAAA1D:
{
"data": {
"services": [
{
"quantity": 1,
"id": "ase_00009UhD4ongolulWAAA1D"
}
]
}
}
You can add extra bags alongside any seats. To do this, you'd just add more items to the services list.
In the order creation request, you'll also specify payments information. The amount for your payment must include the price of all the seats and other services you're adding. To reach the final amount, you'd add together the total_amount of the selected offer and the total_amount of any services.

Checking the created order

In the response after you create an order or if you retrieve your order later, you'll see any seat services you selected in the top-level services field.
If you delve into the passengers inside the segments inside the slices, you'll also see a seat attribute with the designator (e.g. 1D) of the passenger's seat.