Структура ответа#
Детальное описание структуры ответа от /api/avia/seat_map.
Основная структура#
| Поле | Тип | Описание |
|---|---|---|
seatMaps | array | Карты мест по запрошенным сегментам |
error | Error | Информация об ошибке (при наличии) |
Структура SeatMapItem (seatMaps[])#
| Поле | Тип | Описание |
|---|---|---|
segRefId | string | Идентификатор сегмента |
equipment | string | Код типа воздушного судна (например, 320, 73H) |
cabinCompartments | array | Компоновки салона с рядами мест |
Структура CabinCompartment#
| Поле | Тип | Описание |
|---|---|---|
deckCode | string | Код палубы (например, M — главная, U — верхняя) |
columns | string[] | Буквенные обозначения колонок компоновки (например, A, B, C, D, E, F) |
rows | array | Ряды мест в этой компоновке |
Структура Row#
| Поле | Тип | Описание |
|---|---|---|
number | integer | Номер ряда |
characteristics | string[] | Характеристики ряда (например, аварийный выход, переборка) |
seats | array | Места в ряду |
Структура Seat#
| Поле | Тип | Описание |
|---|---|---|
column | string | Буквенное обозначение места (например, A) |
status | SeatOccupationStatus | Статус места |
characteristics | string[] | Характеристики места (окно, проход, дополнительное пространство для ног и т. п.) |
pricesByPaxType | array | Цена места по типам пассажиров (присутствует только для платных мест) |
Структура SeatPriceByPaxType#
| Поле | Тип | Описание |
|---|---|---|
paxType | PassengerType | Тип пассажира |
price | MonetaryAmount | Цена места для данного типа пассажира |
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. Проверьте обязательные поля |
Связанные операции#
- Создание PNR — передача выбранных мест в поле
seats - Получение PNR — итоговые статусы мест (
pnr.seats[].status) - Бронирование мест — бронирование мест из этой карты в существующем PNR