Структура ответа#
Детальное описание структуры ответа от /avia/pnr_retrieve.
Основная структура#
Ответ содержит полную информацию о бронировании.
| Поле | Тип | Описание |
|---|---|---|
bookingId | guid | Идентификатор бронирования (формат UUID) |
pnr | object | Полная информация о PNR |
Структура PNR#
| Поле | Тип | Описание |
|---|---|---|
pnrLocator | string | Локатор бронирования (код PNR) |
pnrKey | string | Ключ PNR (используется в Sirena) |
pnrOrderId | string | Идентификатор заказа у поставщика |
supplier | Supplier | Поставщик (см. Supplier) |
cancelled | boolean | Признак отмены бронирования |
groupBooking | boolean | Признак группового бронирования |
bookData | object | Данные о системе бронирования |
bookingRefs | array | Ссылки на бронирования у перевозчиков |
passengers | array | Список пассажиров |
itinerary | array | Маршрут перевозки |
fareInfo | object | Информация о тарифах и ценах |
contacts | array | Контактные данные |
remarks | array | Ремарки бронирования |
specialServices | array | Специальные услуги (SSR) |
otherServices | array | Прочие сервисы (OSI) |
emd | array | Электронные документы (EMD) |
tickets | array | Информация о билетах (если выписаны) |
Структура BookData#
| Поле | Тип | Описание |
|---|---|---|
crs | string | Код системы бронирования |
bookDate | datetime | Дата создания бронирования (ISO 8601) |
officeId | string | Идентификатор офиса продаж |
Структура BookingRef#
| Поле | Тип | Описание |
|---|---|---|
bookingID | string | Идентификатор бронирования у перевозчика |
carrier | string | Код перевозчика |
bookingKey | string | Ключ бронирования (record locator) |
leadPassenger | string | Имя ведущего пассажира |
crs | string | Система бронирования |
Структура Passenger#
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор пассажира в бронировании |
lastName | string | Фамилия |
firstName | string | Имя |
middleName | string | Отчество |
gender | string | Пол (male, female) |
code | string | Код типа пассажира (ADT, CHD, INF) |
type | string | Тип пассажира (adt, chd, inf) |
title | string | Обращение (MR, MRS, MS) |
documents | Document[] | Документы пассажира |
Структура Document#
| Поле | Тип | Описание |
|---|---|---|
lastName | string | Фамилия в документе |
firstName | string | Имя в документе |
middleName | string | Отчество в документе |
type | DocumentType | Тип документа |
series | string | Серия документа |
number | string | Номер документа |
birthDate | date | Дата рождения |
issueDate | date | Дата выдачи |
expireDate | date | Срок действия |
country | string | Страна выдачи (ISO 3166-1 alpha-2) |
Структура Contact#
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор контакта |
type | string | Тип контакта (email, mobilePhone, etc.) |
value | string | Значение контакта |
passengerId | string | Ссылка на пассажира |
Структура Itinerary#
| Поле | Тип | Описание |
|---|---|---|
segments | array | Сегменты перевозки |
duration | string | Общая длительность (ISO 8601 duration) |
Структура Segment#
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор сегмента |
marketingCarrier | FlightDesignator | Маркетинговый перевозчик |
operatingCarrier | FlightDesignator | Оперирующий перевозчик (при codeshare) |
origin | BoardOffPoint | Пункт отправления |
destination | BoardOffPoint | Пункт прибытия |
duration | string | Длительность сегмента (ISO 8601) |
cabin | CabinType | Класс обслуживания (economy, premiumEconomy, business, first) |
class | string | Код бронирования (RBD) |
equipment | string | Тип воздушного судна |
status | string | Статус сегмента (HK, OK, WL, etc.) |
openSegment | boolean | Признак открытого сегмента |
technicalStops | number | Количество технических остановок |
technicalStopsDetails | TechnicalStop[] | Детали технических остановок |
meal | string | Питание на борту |
Структура Location (Origin/Destination)#
| Поле | Тип | Описание |
|---|---|---|
location | object | Информация о локации |
dateTime | string | Дата и время (ISO 8601) |
terminal | string | Терминал |
Структура Location.location#
| Поле | Тип | Описание |
|---|---|---|
code | string | Код аэропорта/города |
codeType | string | Тип кода (iata, icao) |
type | string | Тип локации (airport, city) |
Структура FareInfo#
| Поле | Тип | Описание |
|---|---|---|
fares | Fare[] | Информация о тарифах по типам пассажиров |
timeLimit | datetime | Срок действия бронирования (тайм-лимит на выписку) |
Структура Fare#
| Поле | Тип | Описание |
|---|---|---|
paxType | string | Тип пассажира (adt, chd, inf) |
validatingCarrier | string | Валидирующий перевозчик |
price | object | Ценовая информация |
itinerary | array | Детали тарифа по сегментам |
Структура Price#
| Поле | Тип | Описание |
|---|---|---|
total | MonetaryAmount | Полная стоимость |
baseFare | MonetaryAmount | Базовый тариф |
equivFare | MonetaryAmount | Эквивалент тарифа (в валюте оплаты, если отличается) |
taxes | Taxes | Таксы и сборы |
Структура Amount#
| Поле | Тип | Описание |
|---|---|---|
currencyCode | string | Код валюты (ISO 4217) |
value | number | Сумма |
Структура Taxes#
| Поле | Тип | Описание |
|---|---|---|
total | object | Общая сумма такс |
breakdown | array | Детализация по кодам такс |
Структура TaxBreakdown#
| Поле | Тип | Описание |
|---|---|---|
code | string | Код таксы/сбора |
amount | object | Сумма |
Структура FareItinerary (SegmentDetails)#
| Поле | Тип | Описание |
|---|---|---|
segRefId | string | Ссылка на сегмент |
fareBasis | string | Код базового тарифа |
tkDesignator | string | Тикет-десигнатор |
baggage | BaggageAllowance | Норма багажа |
Структура Baggage#
| Поле | Тип | Описание |
|---|---|---|
type | string | Тип багажа (carryOn, checked) |
pieceAllowance | object | Норма по количеству мест |
weightAllowance | object | Норма по весу |
Структура Ticket#
| Поле | Тип | Описание |
|---|---|---|
number | string | Номер билета |
lastNumber | string | Последний номер билета в конъюнкции |
exchange | string | Номер билета, на который обменян текущий |
original | string | Номер оригинального билета (до обмена) |
issueDate | datetime | Дата выписки (ISO 8601) |
paxRefId | string | Ссылка на пассажира |
segRefId | string[] | Ссылки на сегменты |
vendor | string | Код 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 | Проверьте формат |
Связанные операции#
- Создание PNR - создание бронирования
- Выписка билета - оформление билетов
- Отмена PNR - отмена бронирования