Структура ответа#
Детальное описание структуры ответа от /api/avia/offer_price.
Основная структура#
Ответ содержит актуальную информацию о запрошенном предложении.
| Поле | Тип | Обязательно | Описание |
|---|
error | Error | Нет | Информация об ошибке (при наличии) |
searchId | string | Нет | Идентификатор поиска. Может быть null (в отличие от /api/avia/search, где поле обязательно) |
offers | array | Нет | Массив с одним предложением |
flights | object | Нет | Словарь с информацией о рейсах |
fareFamilies | object | Нет | Словарь с информацией о тарифных семействах |
Структура Offer#
| Поле | Тип | Обязательно | Описание |
|---|
offerId | string | Да | Идентификатор предложения |
legs | array | Да | Маршрутные плечи |
offerItems | array | Да | Варианты тарифа для предложения |
ticketingRequirements | TicketingRequirements | Да | Требования к выписке билетов |
validatingCarrier | string | Да | Валидирующий перевозчик |
Структура Leg#
| Поле | Тип | Обязательно | Описание |
|---|
segments | array | Да | Сегменты маршрута |
Структура Segment#
| Поле | Тип | Обязательно | Описание |
|---|
segmentId | string | Да | Идентификатор сегмента |
flightId | string | Да | Ссылка на рейс в словаре flights |
Структура OfferItem#
| Поле | Тип | Обязательно | Описание |
|---|
offerItemId | string | Да | Идентификатор варианта тарифа |
totalAmount | object | Да | Полная стоимость |
fareAmount | object | Да | Стоимость тарифа |
taxAmount | object | Нет | Сумма такс и сборов |
details | object | Да | Детали по типам пассажиров |
miniRules | MiniRule[] | Нет | Правила изменения, отмены и возврата билетов (см. MiniRule) |
timeLimit | string | Нет | Срок оплаты (ISO 8601) |
offerExpiration | string | Нет | Срок действия предложения (ISO 8601) |
supplier | Supplier | Да | Код поставщика |
office | string | Да | Код офиса поставщика, для которого рассчитана цена |
ticketingFee | TicketingFee | Нет | Сбор за оформление билета (см. TicketingFee) |
contractFee | ContractFee | Нет | Сервисный сбор и субагентское вознаграждение по контрактному пресету |
bonusDiscount | BonusDiscount | Нет | Бонусная скидка, рассчитанная пресетом Revenue Manager (см. BonusDiscount) |
Структура Details#
Объект с ключами по типам пассажиров (adt, chd, inf):
| Поле | Тип | Обязательно | Описание |
|---|
fareAmount | object | Да | Стоимость тарифа для пассажира |
fareComponents | array | Да | Компоненты тарифа |
totalAmount | object | Да | Полная стоимость для пассажира |
taxes | object | Нет | Детализация такс |
Структура FareComponent#
| Поле | Тип | Обязательно | Описание |
|---|
fareBasisCode | string | Да | Код базового тарифа |
tariffType | string | Да | Тип тарифа (public, corporate) |
ticketDesignator | string | Нет | Дескриптор билета для специальных типов тарифов |
accountCode | string | Нет | Код аккаунта для корпоративных/контрактных тарифов |
baggageAllowances | array | Нет | Нормы багажа |
segmentIds | array | Да | Ссылки на сегменты |
cabinType | string | Да | Класс обслуживания |
rbd | string | Да | Код бронирования (booking class) |
fareFamilyRefId | string | Нет | Ссылка на тарифное семейство |
availableSeatCount | number | Нет | Количество доступных мест |
brand | BrandInfo | Нет | Информация о брендированном тарифе (см. BrandInfo) |
Структура BaggageAllowance#
| Поле | Тип | Обязательно | Описание |
|---|
type | string | Да | Тип багажа (carryOn, checked) |
pieceAllowance | object | Нет | Норма по количеству мест |
weightAllowance | object | Нет | Норма по весу |
dimensions | object | Нет | Ограничения по размерам |
Структура Flight#
Словарь с ключом в формате {carrier}{flightNumber}{origin}-{destination}{date}{time}:
| Поле | Тип | Обязательно | Описание |
|---|
marketingCarrier | object | Да | Маркетинговый перевозчик |
operatingCarrier | object | Нет | Оперирующий перевозчик |
departure | object | Да | Информация об отправлении |
arrival | object | Да | Информация о прибытии |
flightDuration | duration | Нет | Время в пути (ISO 8601 duration) |
equipmentCode | string | Нет | Код типа воздушного судна (например, 320, 737) |
type | string | Да | Тип рейса (scheduled, charter) |
Структура FareFamily#
Словарь с ключом в формате {carrier}_{familyName}:
| Поле | Тип | Обязательно | Описание |
|---|
carrierCode | string | Да | Код перевозчика |
name | string | Да | Название тарифного семейства |
description | string | Нет | Описание условий |
Структура TicketingRequirements#
Требования к выписке билета:
| Поле | Тип | Обязательно | Описание |
|---|
ticketQuantity | integer | Да | Количество билетов для выписки |
details | TicketingDetail[] | Нет | Детали по сегментам |
Структура TicketingDetail#
| Поле | Тип | Обязательно | Описание |
|---|
segmentIds | string[] | Да | Ссылки на сегменты |
validatingCarrier | string | Да | Код авиакомпании-валидатора (IATA) |
fareAmount | object | Нет | Базовый тариф для этого билета. null, если постатейное (per-ticket) ценообразование недоступно |
taxAmount | object | Нет | Сумма такс для этого билета. null, если постатейное (per-ticket) ценообразование недоступно |
totalAmount | object | Нет | Итоговая сумма (тариф + таксы) для этого билета. null, если постатейное (per-ticket) ценообразование недоступно |
taxes | object | Нет | Разбивка такс для этого билета. 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 — его формат зависит от поставщика и не фиксирован.
Связанные операции#