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

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

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

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

ПолеТипОбязательноОписание
errorErrorНетИнформация об ошибке (при наличии)
searchIdstringНетИдентификатор поиска. Может быть null (в отличие от /api/avia/search, где поле обязательно)
offersarrayНетМассив с одним предложением
flightsobjectНетСловарь с информацией о рейсах
fareFamiliesobjectНетСловарь с информацией о тарифных семействах

Структура Offer#

ПолеТипОбязательноОписание
offerIdstringДаИдентификатор предложения
legsarrayДаМаршрутные плечи
offerItemsarrayДаВарианты тарифа для предложения
ticketingRequirementsTicketingRequirementsДаТребования к выписке билетов
validatingCarrierstringДаВалидирующий перевозчик

Структура Leg#

ПолеТипОбязательноОписание
segmentsarrayДаСегменты маршрута

Структура Segment#

ПолеТипОбязательноОписание
segmentIdstringДаИдентификатор сегмента
flightIdstringДаСсылка на рейс в словаре flights

Структура OfferItem#

ПолеТипОбязательноОписание
offerItemIdstringДаИдентификатор варианта тарифа
totalAmountobjectДаПолная стоимость
fareAmountobjectДаСтоимость тарифа
taxAmountobjectНетСумма такс и сборов
detailsobjectДаДетали по типам пассажиров
miniRulesMiniRule[]НетПравила изменения, отмены и возврата билетов (см. MiniRule)
timeLimitstringНетСрок оплаты (ISO 8601)
offerExpirationstringНетСрок действия предложения (ISO 8601)
supplierSupplierДаКод поставщика
officestringДаКод офиса поставщика, для которого рассчитана цена
ticketingFeeTicketingFeeНетСбор за оформление билета (см. TicketingFee)
contractFeeContractFeeНетСервисный сбор и субагентское вознаграждение по контрактному пресету
bonusDiscountBonusDiscountНетБонусная скидка, рассчитанная пресетом Revenue Manager (см. BonusDiscount)

Структура Details#

Объект с ключами по типам пассажиров (adt, chd, inf):

ПолеТипОбязательноОписание
fareAmountobjectДаСтоимость тарифа для пассажира
fareComponentsarrayДаКомпоненты тарифа
totalAmountobjectДаПолная стоимость для пассажира
taxesobjectНетДетализация такс

Структура FareComponent#

ПолеТипОбязательноОписание
fareBasisCodestringДаКод базового тарифа
tariffTypestringДаТип тарифа (public, corporate)
ticketDesignatorstringНетДескриптор билета для специальных типов тарифов
accountCodestringНетКод аккаунта для корпоративных/контрактных тарифов
baggageAllowancesarrayНетНормы багажа
segmentIdsarrayДаСсылки на сегменты
cabinTypestringДаКласс обслуживания
rbdstringДаКод бронирования (booking class)
fareFamilyRefIdstringНетСсылка на тарифное семейство
availableSeatCountnumberНетКоличество доступных мест
brandBrandInfoНетИнформация о брендированном тарифе (см. BrandInfo)

Структура BaggageAllowance#

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

Структура Flight#

Словарь с ключом в формате {carrier}{flightNumber}{origin}-{destination}{date}{time}:

ПолеТипОбязательноОписание
marketingCarrierobjectДаМаркетинговый перевозчик
operatingCarrierobjectНетОперирующий перевозчик
departureobjectДаИнформация об отправлении
arrivalobjectДаИнформация о прибытии
flightDurationdurationНетВремя в пути (ISO 8601 duration)
equipmentCodestringНетКод типа воздушного судна (например, 320, 737)
typestringДаТип рейса (scheduled, charter)

Структура FareFamily#

Словарь с ключом в формате {carrier}_{familyName}:

ПолеТипОбязательноОписание
carrierCodestringДаКод перевозчика
namestringДаНазвание тарифного семейства
descriptionstringНетОписание условий

Структура TicketingRequirements#

Требования к выписке билета:

ПолеТипОбязательноОписание
ticketQuantityintegerДаКоличество билетов для выписки
detailsTicketingDetail[]НетДетали по сегментам

Структура TicketingDetail#

ПолеТипОбязательноОписание
segmentIdsstring[]ДаСсылки на сегменты
validatingCarrierstringДаКод авиакомпании-валидатора (IATA)
fareAmountobjectНетБазовый тариф для этого билета. null, если постатейное (per-ticket) ценообразование недоступно
taxAmountobjectНетСумма такс для этого билета. null, если постатейное (per-ticket) ценообразование недоступно
totalAmountobjectНетИтоговая сумма (тариф + таксы) для этого билета. null, если постатейное (per-ticket) ценообразование недоступно
taxesobjectНетРазбивка такс для этого билета. null, если детализация такс недоступна

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

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

Развернуть полный пример
  1{
  2  "searchId": "699C55215661822C2EC828B0F661A304",
  3  "offers": [
  4    {
  5      "offerId": "3F4CF01BC668FA5F51BC21B1142B26F9",
  6      "legs": [
  7        {
  8          "segments": [
  9            {
 10              "segmentId": "88D994BF3A7C6CE05E54D8BBE5A3E4BD",
 11              "flightId": "DP6841SVO-KZN211120250740"
 12            }
 13          ]
 14        }
 15      ],
 16      "offerItems": [
 17        {
 18          "offerItemId": "1691A9FCFD85DC8DB9D6093D7E75C5C0",
 19          "totalAmount": {
 20            "currencyCode": "RUB",
 21            "value": 1499
 22          },
 23          "fareAmount": {
 24            "currencyCode": "RUB",
 25            "value": 1399
 26          },
 27          "taxAmount": {
 28            "currencyCode": "RUB",
 29            "value": 100
 30          },
 31          "details": {
 32            "adt": {
 33              "fareAmount": {
 34                "currencyCode": "RUB",
 35                "value": 1399
 36              },
 37              "fareComponents": [
 38                {
 39                  "fareBasisCode": "PROMOALL",
 40                  "tariffType": "public",
 41                  "baggageAllowances": [
 42                    {
 43                      "type": "carryOn",
 44                      "pieceAllowance": {
 45                        "totalPieces": 0
 46                      }
 47                    }
 48                  ],
 49                  "segmentIds": ["88D994BF3A7C6CE05E54D8BBE5A3E4BD"],
 50                  "cabinType": "economy",
 51                  "rbd": "P",
 52                  "fareFamilyRefId": "DP_БАЗОВЫЙ",
 53                  "availableSeatCount": 1
 54                }
 55              ],
 56              "totalAmount": {
 57                "currencyCode": "RUB",
 58                "value": 1499
 59              },
 60              "taxes": {
 61                "total": {
 62                  "currencyCode": "RUB",
 63                  "value": 100
 64                },
 65                "breakdown": [
 66                  {
 67                    "code": "YR",
 68                    "amount": {
 69                      "currencyCode": "RUB",
 70                      "value": 100
 71                    }
 72                  }
 73                ]
 74              }
 75            }
 76          },
 77          "timeLimit": "2025-10-22T19:05:47",
 78          "offerExpiration": "2025-10-22T19:05:47",
 79          "supplier": "mixvel",
 80          "office": "MOW01"
 81        }
 82      ],
 83      "ticketingRequirements": {
 84        "ticketQuantity": 1,
 85        "details": [
 86          {
 87            "segmentIds": ["88D994BF3A7C6CE05E54D8BBE5A3E4BD"],
 88            "validatingCarrier": "DP"
 89          }
 90        ]
 91      },
 92      "validatingCarrier": "DP"
 93    }
 94  ],
 95  "flights": {
 96    "DP6841SVO-KZN211120250740": {
 97      "marketingCarrier": {
 98        "carrierCode": "DP",
 99        "flightNumber": "6841"
100      },
101      "operatingCarrier": {
102        "carrierCode": "DP",
103        "flightNumber": "6841"
104      },
105      "departure": {
106        "location": {
107          "code": "SVO",
108          "codeType": "iata",
109          "type": "airport"
110        },
111        "dateTime": "2025-11-21T07:40:00",
112        "terminal": "D"
113      },
114      "arrival": {
115        "location": {
116          "code": "KZN",
117          "codeType": "iata",
118          "type": "airport"
119        },
120        "dateTime": "2025-11-21T09:20:00",
121        "terminal": "1"
122      },
123      "type": "scheduled"
124    }
125  },
126  "fareFamilies": {
127    "DP_БАЗОВЫЙ": {
128      "carrierCode": "DP",
129      "name": "БАЗОВЫЙ",
130      "description": "НОРМА РУЧНОЙ КЛАДИ"
131    }
132  }
133}

Ответ с несколькими вариантами тарифа#

Если для предложения доступны несколько тарифных семейств:

 1{
 2  "searchId": "699C55215661822C2EC828B0F661A304",
 3  "offers": [
 4    {
 5      "offerItems": [
 6        {
 7          "offerItemId": "1691A9FCFD85DC8DB9D6093D7E75C5C0",
 8          "totalAmount": { "currencyCode": "RUB", "value": 1499 },
 9          "details": {
10            "adt": {
11              "fareComponents": [
12                { "fareFamilyRefId": "DP_БАЗОВЫЙ" }
13              ]
14            }
15          }
16        },
17        {
18          "offerItemId": "DAB32144B940FCC65CC85E9BCE682346",
19          "totalAmount": { "currencyCode": "RUB", "value": 2949 },
20          "details": {
21            "adt": {
22              "fareComponents": [
23                { "fareFamilyRefId": "DP_ВЫГОДНЫЙ" }
24              ]
25            }
26          }
27        },
28        {
29          "offerItemId": "4E435B2299838F5C9E819BDB13FCD9AA",
30          "totalAmount": { "currencyCode": "RUB", "value": 5599 },
31          "details": {
32            "adt": {
33              "fareComponents": [
34                { "fareFamilyRefId": "DP_МАКСИМУМ" }
35              ]
36            }
37          }
38        }
39      ]
40    }
41  ]
42}

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

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

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

Проверка изменения цены#

1var originalPrice = 1499m;
2var actualPrice = response.Offers[0].OfferItems[0].TotalAmount.Value;
3
4if (actualPrice != originalPrice)
5{
6    var difference = actualPrice - originalPrice;
7    Console.WriteLine($"Цена изменилась на {difference:+#;-#;0} ₽");
8}

Проверка доступности мест#

1var fareComponent = response.Offers[0]
2    .OfferItems[0]
3    .Details[PassengerType.ADT]
4    .FareComponents[0];
5
6if (fareComponent.AvailableSeatCount < requiredSeats)
7{
8    Console.WriteLine("Недостаточно мест");
9}

Проверка срока действия#

1var offerExpiration = response.Offers[0].OfferItems[0].OfferExpiration;
2
3if (offerExpiration.HasValue && offerExpiration.Value < DateTime.Now)
4{
5    Console.WriteLine("Предложение истекло");
6}

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

Код ошибкиПричинаРешение
OFFER_NOT_FOUNDПредложение не найдено или срок его действия истёкВыполните новый поиск
CURRENCY_RATE_NOT_AVAILABLEНет курса для конвертации сумм в валюту отображенияПовторите запрос позже
VALIDATION_ERRORОшибка валидации запроса (HTTP 400)Проверьте обязательные поля и форматы значений
NO_TARGETSПод запрос не нашлось ни одного поставщика: ни один не настроен либо все отсеяны на этапе подготовки запросаПроверьте настройки офисов и пресетов в личном кабинете; при сохранении ошибки обратитесь в поддержку
SUPPLIER_ERRORПоставщик вернул ошибку. Причина — текстом поставщика в поле messageРазберите message; при необходимости повторите запрос позже
SYSTEM_ERRORВнутренняя ошибка Travel APIПовторите запрос позже; при повторении обратитесь в поддержку с errorId

Ошибки, пришедшие от GDS/NDC-поставщика, возвращаются под кодом SUPPLIER_ERROR: отдельного кода на каждую причину отказа Travel API не формирует, причина передаётся текстом поставщика в поле message. Не завязывайте логику на разбор message — его формат зависит от поставщика и не фиксирован.


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