Структура ответа#

Детальное описание структуры ответа от /api/avia/seat_map.

Основная структура#

ПолеТипОписание
seatMapsarrayКарты мест по запрошенным сегментам
errorErrorИнформация об ошибке (при наличии)

Структура SeatMapItem (seatMaps[])#

ПолеТипОписание
segRefIdstringИдентификатор сегмента
equipmentstringКод типа воздушного судна (например, 320, 73H)
cabinCompartmentsarrayКомпоновки салона с рядами мест

Структура CabinCompartment#

ПолеТипОписание
deckCodestringКод палубы (например, M — главная, U — верхняя)
columnsstring[]Буквенные обозначения колонок компоновки (например, A, B, C, D, E, F)
rowsarrayРяды мест в этой компоновке

Структура Row#

ПолеТипОписание
numberintegerНомер ряда
characteristicsstring[]Характеристики ряда (например, аварийный выход, переборка)
seatsarrayМеста в ряду

Структура Seat#

ПолеТипОписание
columnstringБуквенное обозначение места (например, A)
statusSeatOccupationStatusСтатус места
characteristicsstring[]Характеристики места (окно, проход, дополнительное пространство для ног и т. п.)
pricesByPaxTypearrayЦена места по типам пассажиров (присутствует только для платных мест)

Структура SeatPriceByPaxType#

ПолеТипОписание
paxTypePassengerTypeТип пассажира
priceMonetaryAmountЦена места для данного типа пассажира

SeatOccupationStatus#

Статус занятости места.

ЗначениеОписание
fСвободно (free)
oЗанято (occupied)

Примеры ответов#

Успешный ответ#

Развернуть полный пример
 1{
 2  "seatMaps": [
 3    {
 4      "segRefId": "5b6c7d8e-9f0a-41b2-8c3d-4e5f60718293",
 5      "equipment": "320",
 6      "cabinCompartments": [
 7        {
 8          "deckCode": "M",
 9          "columns": ["A", "B", "C", "D", "E", "F"],
10          "rows": [
11            {
12              "number": 12,
13              "seats": [
14                { "column": "A", "status": "f", "characteristics": ["window"] },
15                { "column": "B", "status": "f" },
16                { "column": "C", "status": "o" },
17                { "column": "D", "status": "f" },
18                { "column": "E", "status": "o" },
19                { "column": "F", "status": "f", "characteristics": ["window"] }
20              ]
21            },
22            {
23              "number": 13,
24              "characteristics": ["exitRow"],
25              "seats": [
26                {
27                  "column": "A",
28                  "status": "f",
29                  "characteristics": ["window", "extraLegroom"],
30                  "pricesByPaxType": [
31                    { "paxType": "adt", "price": { "currencyCode": "RUB", "value": 500 } },
32                    { "paxType": "chd", "price": { "currencyCode": "RUB", "value": 400 } }
33                  ]
34                },
35                { "column": "B", "status": "f", "characteristics": ["extraLegroom"] },
36                { "column": "C", "status": "f", "characteristics": ["aisle", "extraLegroom"] },
37                { "column": "D", "status": "o" },
38                { "column": "E", "status": "f", "characteristics": ["aisle", "extraLegroom"] },
39                {
40                  "column": "F",
41                  "status": "f",
42                  "characteristics": ["window", "extraLegroom"],
43                  "pricesByPaxType": [
44                    { "paxType": "adt", "price": { "currencyCode": "RUB", "value": 500 } },
45                    { "paxType": "chd", "price": { "currencyCode": "RUB", "value": 400 } }
46                  ]
47                }
48              ]
49            },
50            {
51              "number": 14,
52              "seats": [
53                { "column": "A", "status": "f" },
54                { "column": "B", "status": "f" },
55                { "column": "C", "status": "f" },
56                { "column": "D", "status": "f" },
57                { "column": "E", "status": "o" },
58                { "column": "F", "status": "f" }
59              ]
60            }
61          ]
62        }
63      ]
64    }
65  ]
66}

Ответ с ошибкой (предложение истекло)#

1{
2  "error": {
3    "code": "OFFER_NOT_FOUND",
4    "message": "Offer not found or expired",
5    "description": "Offer not found or expired",
6    "errorId": "018c5f2e-9b3a-7f4d-8e2c-1a2b3c4d5e6f"
7  }
8}

Ответ с ошибкой (бронирование не найдено)#

1{
2  "error": {
3    "code": "BOOKING_NOT_FOUND",
4    "message": "Booking not found",
5    "description": "Booking not found",
6    "errorId": "018c5f2e-9b3a-7f4d-8e2c-1a2b3c4d5e6f"
7  }
8}

Использование данных#

Построение схемы салона#

 1foreach (var seatMap in response.SeatMaps)
 2{
 3    foreach (var compartment in seatMap.CabinCompartments)
 4    {
 5        foreach (var row in compartment.Rows)
 6        {
 7            foreach (var seat in row.Seats)
 8            {
 9                var isFree = seat.Status == SeatOccupationStatus.F;
10                Console.WriteLine($"{row.Number}{seat.Column}: {(isFree ? "свободно" : "занято")}");
11            }
12        }
13    }
14}

Получение цены места для типа пассажира#

 1var seat = row.Seats.First(s => s.Column == "A");
 2
 3var price = seat.PricesByPaxType?
 4    .FirstOrDefault(p => p.PaxType == PassengerType.ADT)
 5    ?.Price;
 6
 7if (price != null)
 8{
 9    Console.WriteLine($"Место {row.Number}{seat.Column}: {price.Value} {price.CurrencyCode}");
10}
11else
12{
13    Console.WriteLine($"Место {row.Number}{seat.Column} бесплатное");
14}

Типичные ошибки#

Код ошибкиПричинаРешение
OFFER_NOT_FOUNDПредложение истекло или не найдено в кэшеВыполните новый поиск / offer_price
BOOKING_NOT_FOUNDБронирование не найдено либо принадлежит другому клиентуПроверьте booking.id
SEAT_INVALID_REQUESTНарушен формат блока offer/booking (см. параметры запроса)HTTP 400. Проверьте состав запроса
VALIDATION_ERRORПрочие нарушения формата запросаHTTP 400. Проверьте обязательные поля

Связанные операции#