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

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

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

Ответ содержит полную информацию о бронировании.

ПолеТипОписание
bookingIdguidИдентификатор бронирования (формат UUID)
pnrobjectПолная информация о PNR

Структура PNR#

ПолеТипОписание
pnrLocatorstringЛокатор бронирования (код PNR)
pnrKeystringКлюч PNR (используется в Sirena)
pnrOrderIdstringИдентификатор заказа у поставщика
supplierSupplierПоставщик (см. Supplier)
cancelledbooleanПризнак отмены бронирования
groupBookingbooleanПризнак группового бронирования
bookDataobjectДанные о системе бронирования
bookingRefsarrayСсылки на бронирования у перевозчиков
passengersarrayСписок пассажиров
itineraryarrayМаршрут перевозки
fareInfoobjectИнформация о тарифах и ценах
contactsarrayКонтактные данные
remarksarrayРемарки бронирования
specialServicesarrayСпециальные услуги (SSR)
otherServicesarrayПрочие сервисы (OSI)
emdarrayЭлектронные документы (EMD)
ticketsarrayИнформация о билетах (если выписаны)

Структура BookData#

ПолеТипОписание
crsstringКод системы бронирования
bookDatedatetimeДата создания бронирования (ISO 8601)
officeIdstringИдентификатор офиса продаж

Структура BookingRef#

ПолеТипОписание
bookingIDstringИдентификатор бронирования у перевозчика
carrierstringКод перевозчика
bookingKeystringКлюч бронирования (record locator)
leadPassengerstringИмя ведущего пассажира
crsstringСистема бронирования

Структура Passenger#

ПолеТипОписание
idstringИдентификатор пассажира в бронировании
lastNamestringФамилия
firstNamestringИмя
middleNamestringОтчество
genderstringПол (male, female)
codestringКод типа пассажира (ADT, CHD, INF)
typestringТип пассажира (adt, chd, inf)
titlestringОбращение (MR, MRS, MS)
documentsDocument[]Документы пассажира

Структура Document#

ПолеТипОписание
lastNamestringФамилия в документе
firstNamestringИмя в документе
middleNamestringОтчество в документе
typeDocumentTypeТип документа
seriesstringСерия документа
numberstringНомер документа
birthDatedateДата рождения
issueDatedateДата выдачи
expireDatedateСрок действия
countrystringСтрана выдачи (ISO 3166-1 alpha-2)

Структура Contact#

ПолеТипОписание
idstringИдентификатор контакта
typestringТип контакта (email, mobilePhone, etc.)
valuestringЗначение контакта
passengerIdstringСсылка на пассажира

Структура Itinerary#

ПолеТипОписание
segmentsarrayСегменты перевозки
durationstringОбщая длительность (ISO 8601 duration)

Структура Segment#

ПолеТипОписание
idstringИдентификатор сегмента
marketingCarrierFlightDesignatorМаркетинговый перевозчик
operatingCarrierFlightDesignatorОперирующий перевозчик (при codeshare)
originBoardOffPointПункт отправления
destinationBoardOffPointПункт прибытия
durationstringДлительность сегмента (ISO 8601)
cabinCabinTypeКласс обслуживания (economy, premiumEconomy, business, first)
classstringКод бронирования (RBD)
equipmentstringТип воздушного судна
statusstringСтатус сегмента (HK, OK, WL, etc.)
openSegmentbooleanПризнак открытого сегмента
technicalStopsnumberКоличество технических остановок
technicalStopsDetailsTechnicalStop[]Детали технических остановок
mealstringПитание на борту

Структура Location (Origin/Destination)#

ПолеТипОписание
locationobjectИнформация о локации
dateTimestringДата и время (ISO 8601)
terminalstringТерминал

Структура Location.location#

ПолеТипОписание
codestringКод аэропорта/города
codeTypestringТип кода (iata, icao)
typestringТип локации (airport, city)

Структура FareInfo#

ПолеТипОписание
faresFare[]Информация о тарифах по типам пассажиров
timeLimitdatetimeСрок действия бронирования (тайм-лимит на выписку)

Структура Fare#

ПолеТипОписание
paxTypestringТип пассажира (adt, chd, inf)
validatingCarrierstringВалидирующий перевозчик
priceobjectЦеновая информация
itineraryarrayДетали тарифа по сегментам

Структура Price#

ПолеТипОписание
totalMonetaryAmountПолная стоимость
baseFareMonetaryAmountБазовый тариф
equivFareMonetaryAmountЭквивалент тарифа (в валюте оплаты, если отличается)
taxesTaxesТаксы и сборы

Структура Amount#

ПолеТипОписание
currencyCodestringКод валюты (ISO 4217)
valuenumberСумма

Структура Taxes#

ПолеТипОписание
totalobjectОбщая сумма такс
breakdownarrayДетализация по кодам такс
Структура TaxBreakdown#
ПолеТипОписание
codestringКод таксы/сбора
amountobjectСумма

Структура FareItinerary (SegmentDetails)#

ПолеТипОписание
segRefIdstringСсылка на сегмент
fareBasisstringКод базового тарифа
tkDesignatorstringТикет-десигнатор
baggageBaggageAllowanceНорма багажа

Структура Baggage#

ПолеТипОписание
typestringТип багажа (carryOn, checked)
pieceAllowanceobjectНорма по количеству мест
weightAllowanceobjectНорма по весу

Структура Ticket#

ПолеТипОписание
numberstringНомер билета
lastNumberstringПоследний номер билета в конъюнкции
exchangestringНомер билета, на который обменян текущий
originalstringНомер оригинального билета (до обмена)
issueDatedatetimeДата выписки (ISO 8601)
paxRefIdstringСсылка на пассажира
segRefIdstring[]Ссылки на сегменты
vendorstringКод BSP/ARC

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

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

Развернуть полный пример
  1{
  2  "bookingId": "019a0c82-5d2b-7a5e-84fe-56357a57df66",
  3  "pnr": {
  4    "bookData": {
  5      "crs": "1H",
  6      "officeId": "TCH"
  7    },
  8    "bookingRefs": [
  9      {
 10        "bookingID": "28C2D3",
 11        "carrier": "15"
 12      },
 13      {
 14        "bookingID": "0D1MD9",
 15        "carrier": "DP"
 16      }
 17    ],
 18    "cancelled": false,
 19    "contacts": [
 20      {
 21        "id": "Contact-1",
 22        "type": "mobilePhone",
 23        "value": "+79623387344",
 24        "passengerId": "Pax-1"
 25      },
 26      {
 27        "id": "Contact-1",
 28        "type": "email",
 29        "value": "test.user+1761146456225@example.com",
 30        "passengerId": "Pax-1"
 31      }
 32    ],
 33    "fareInfo": {
 34      "fares": [
 35        {
 36          "paxType": "adt",
 37          "price": {
 38            "total": {
 39              "currencyCode": "RUB",
 40              "value": 7949
 41            },
 42            "baseFare": {
 43              "currencyCode": "RUB",
 44              "value": 2849
 45            },
 46            "taxes": {
 47              "total": {
 48                "currencyCode": "RUB",
 49                "value": 5100
 50              },
 51              "breakdown": [
 52                {
 53                  "code": "CP",
 54                  "amount": {
 55                    "currencyCode": "RUB",
 56                    "value": 5000
 57                  }
 58                },
 59                {
 60                  "code": "YR",
 61                  "amount": {
 62                    "currencyCode": "RUB",
 63                    "value": 100
 64                  }
 65                }
 66              ]
 67            }
 68          },
 69          "validatingCarrier": "DP",
 70          "itinerary": [
 71            {
 72              "segRefId": "0593d1c1-6ed6-417c-9247-435850993dda",
 73              "fareBasis": "PAD",
 74              "baggage": {
 75                "type": "carryOn",
 76                "pieceAllowance": {
 77                  "totalPieces": 1
 78                }
 79              }
 80            }
 81          ]
 82        }
 83      ]
 84    },
 85    "groupBooking": false,
 86    "itinerary": [
 87      {
 88        "segments": [
 89          {
 90            "id": "0593d1c1-6ed6-417c-9247-435850993dda",
 91            "cabin": "economy",
 92            "class": "P",
 93            "destination": {
 94              "location": {
 95                "code": "KZN",
 96                "codeType": "iata",
 97                "type": "airport"
 98              },
 99              "dateTime": "2025-11-22T09:20:00",
100              "terminal": "1"
101            },
102            "duration": "01:40:00",
103            "equipment": "73H",
104            "marketingCarrier": {
105              "carrierCode": "DP",
106              "flightNumber": "6841"
107            },
108            "openSegment": false,
109            "origin": {
110              "location": {
111                "code": "SVO",
112                "codeType": "iata",
113                "type": "airport"
114              },
115              "dateTime": "2025-11-22T07:40:00",
116              "terminal": "D"
117            },
118            "status": "HK",
119            "technicalStops": 0
120          }
121        ],
122        "duration": "01:40:00"
123      }
124    ],
125    "passengers": [
126      {
127        "id": "Pax-1",
128        "lastName": "IVANOV",
129        "firstName": "SVETLANA",
130        "gender": "female",
131        "documents": [
132          {
133            "lastName": "IVANOV",
134            "firstName": "SVETLANA",
135            "type": "internationalPassport",
136            "number": "411649833",
137            "birthDate": "1981-07-12",
138            "issueDate": "2008-08-16",
139            "expireDate": "2026-10-22",
140            "country": "RU"
141          }
142        ],
143        "code": "ADT",
144        "type": "adt"
145      }
146    ],
147    "pnrLocator": "28C2D3",
148    "pnrOrderId": "69120-251022-OTT5447|69120-251022-MTT5446",
149    "tickets": [
150      {
151        "exchange": "6170037265",
152        "issueDate": "2025-10-22T00:00:00",
153        "number": "6170037281",
154        "paxRefId": "Pax-1",
155        "segRefId": ["0593d1c1-6ed6-417c-9247-435850993dda"],
156        "vendor": "425"
157      }
158    ]
159  }
160}

Бронирование без билетов#

Если билеты еще не выписаны, массив tickets будет пустым:

 1{
 2  "bookingId": "019a0c82-5d2b-7a5e-84fe-56357a57df66",
 3  "pnr": {
 4    "pnrLocator": "28C2D3",
 5    "cancelled": false,
 6    "passengers": [...],
 7    "itinerary": [...],
 8    "fareInfo": {...},
 9    "tickets": []
10  }
11}

Отмененное бронирование#

1{
2  "bookingId": "019a0c82-5d2b-7a5e-84fe-56357a57df66",
3  "pnr": {
4    "pnrLocator": "28C2D3",
5    "cancelled": true,
6    "passengers": [...],
7    "itinerary": [...]
8  }
9}

Ответ с ошибкой#

1{
2  "error": {
3    "code": "BOOKING_NOT_FOUND",
4    "message": "Бронирование не найдено",
5    "description": "Бронирование с указанным ID не существует",
6    "errorId": "018c5f2e-9b3a-7f4d-8e2c-1a2b3c4d5e6f"
7  }
8}

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

Проверка статуса бронирования#

 1var response = await RetrieveBooking(bookingId);
 2
 3if (response.Pnr.Cancelled)
 4{
 5    Console.WriteLine("Бронирование отменено");
 6}
 7else if (response.Pnr.Tickets.Any())
 8{
 9    Console.WriteLine($"Билеты выписаны: {string.Join(", ", response.Pnr.Tickets.Select(t => t.Number))}");
10}
11else
12{
13    Console.WriteLine("Бронирование активно, ожидает оплаты");
14}

Получение информации о пассажирах#

 1foreach (var passenger in response.Pnr.Passengers)
 2{
 3    Console.WriteLine($"{passenger.LastName} {passenger.FirstName}");
 4    Console.WriteLine($"Тип: {passenger.Type.ToUpper()}");
 5
 6    if (passenger.Document != null)
 7    {
 8        Console.WriteLine($"Документ: {passenger.Document.Type} {passenger.Document.Number}");
 9        Console.WriteLine($"Срок действия: {passenger.Document.ExpireDate}");
10    }
11}

Формирование маршрута#

 1foreach (var leg in response.Pnr.Itinerary)
 2{
 3    foreach (var segment in leg.Segments)
 4    {
 5        var origin = segment.Origin.Location.Code;
 6        var destination = segment.Destination.Location.Code;
 7        var departure = segment.Origin.DateTime;
 8        var arrival = segment.Destination.DateTime;
 9        var flight = $"{segment.MarketingCarrier.CarrierCode}{segment.MarketingCarrier.FlightNumber}";
10
11        Console.WriteLine($"{origin} → {destination}");
12        Console.WriteLine($"Рейс: {flight}");
13        Console.WriteLine($"Вылет: {departure:dd.MM.yyyy HH:mm}");
14        Console.WriteLine($"Прибытие: {arrival:dd.MM.yyyy HH:mm}");
15        Console.WriteLine($"Статус: {segment.Status}");
16    }
17}

Получение стоимости#

 1var totalPrice = 0m;
 2
 3foreach (var fare in response.Pnr.FareInfo.Fares)
 4{
 5    var passengerCount = response.Pnr.Passengers.Count(p => p.Type == fare.PaxType);
 6    var price = fare.Price.Total.Value * passengerCount;
 7    totalPrice += price;
 8
 9    Console.WriteLine($"{fare.PaxType.ToUpper()}: {fare.Price.Total.Value} {fare.Price.Total.CurrencyCode} × {passengerCount}");
10}
11
12Console.WriteLine($"Итого: {totalPrice} RUB");

Проверка наличия контактов#

 1var email = response.Pnr.Contacts.FirstOrDefault(c => c.Type == "email")?.Value;
 2var phone = response.Pnr.Contacts.FirstOrDefault(c => c.Type == "mobilePhone")?.Value;
 3
 4if (!string.IsNullOrEmpty(email))
 5{
 6    Console.WriteLine($"Email: {email}");
 7}
 8
 9if (!string.IsNullOrEmpty(phone))
10{
11    Console.WriteLine($"Телефон: {phone}");
12}

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

Код ошибкиПричинаРешение
BOOKING_NOT_FOUNDБронирование не найденоПроверьте bookingId
ACCESS_DENIEDНет доступаПроверьте права пользователя
INVALID_BOOKING_IDНекорректный IDПроверьте формат

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