Руководство по использованию API
Полное руководство для интеграции с нашим API через Swagger UI
🚀 Открыть Swagger UI📖 Введение
Это руководство предоставляет подробное описание взаимодействия с нашим API. Оно призвано предоставить глубокое понимание логики работы нашего API, используя Swagger UI как основной инструмент для интерактивного изучения и тестирования.
1️⃣ Получение токена аутентификации
Это фундаментальный шаг, который инициирует сессию взаимодействия с API. Без валидного токена ни один другой защищенный эндпоинт не будет доступен.
📥 Ключевые поля запроса:
- username (string, обязательное) - Уникальный идентификатор партнера в нашей системе
- password (string, обязательное) - Секретный ключ, ассоциированный с вашим именем пользователя
📤 Ключевые поля ответа:
- status (string) - Индикатор успешности операции
- token (string) - Ваш JWT токен для авторизации
Bearer <ВАШ_ТОКЕН>
2️⃣ Запрос коммерческого предложения (Air Shopping)
Это основной эндпоинт для поиска авиабилетов и формирования предложений.
📥 Ключевые поля запроса:
- itinerary (array) - Массив сегментов маршрута с полями:
- origin - IATA-код города отправления
- destination - IATA-код города прибытия
- date_to - Дата вылета (YYYY-MM-DD)
- flight_class (string) - Класс обслуживания (Economy, Business, First)
- adt (integer) - Количество взрослых пассажиров
- chd (integer, опц.) - Количество детей
- inf (integer, опц.) - Количество младенцев без места
- currency (string) - Требуемая валюта (TJS, RUB, USD, EUR)
📤 Ключевые поля ответа:
- OfferID - ⚡ Уникальный идентификатор предложения (важно для последующих запросов!)
- Flights - Детали каждого перелета
- TotalPrice - Суммарная стоимость предложения
- OfferExpirationTimeLimitDateTime - Время действия предложения
3️⃣ Запрос правил применения тарифов
Предоставляет необходимую информацию для клиента перед покупкой билета.
📥 Ключевые поля запроса:
- offer_id (string) - OfferID из предыдущего запроса
📤 Ключевые поля ответа:
- FareRuleText - Объект с текстом правил тарифа
- RemarkText - Сырой текст тарифных правил
4️⃣ Уточнение цены
📥 Ключевые поля запроса:
- offer_id (string) - OfferID предложения
- currency (string) - Валюта для уточненной цены
📤 Ключевые поля ответа:
- OfferID - Актуальный OfferID (может измениться!)
- TotalPrice - Уточненная полная стоимость
- BookingID - ⚡ Временный ID бронирования (сохраните для следующих шагов!)
5️⃣ Резервирование инвентаря (Inventory Guarantee)
Этот шаг является опциональным, но настоятельно рекомендуется для критически важных бронирований.
📥 Ключевые поля запроса:
- offer_id (string) - Актуальный OfferID из /api/offerprice/
📤 Ключевые поля ответа:
- InventoryGuaranteeID - ID резервации
- InventoryGuaranteeTimeLimitDateTime - Время действия резервации
6️⃣ Создание заказа (Booking Creation)
Основной этап формирования бронирования с привязкой к конкретным пассажирам.
📥 Ключевые поля запроса:
- booking_id (integer) - BookingID из /api/offerprice/
- paxes (array) - Массив данных о пассажирах:
- pax_id - ID пассажира
- ptc - Тип пассажира (ADT, CHD, INF)
- individual - Личные данные (имя, фамилия, дата рождения, пол)
- doc - Документ (номер, тип, страна)
- currency (string) - Валюта заказа
📤 Ключевые поля ответа:
- MixOrderID - Внутренний ID заказа
- PNRBookingID - ⚡ PNR-код бронирования
- AirlineBookingID - Код бронирования авиакомпании
- StatusCode - Текущий статус (обычно "OPENED")
7️⃣ Одобрение заказа (Order Approval)
📥 Ключевые поля запроса:
- booking_id (integer) - BookingID заказа для одобрения
- currency (string) - Валюта заказа
📤 Ключевые поля ответа:
- StatusCode - Новый статус (обычно "CLOSED")
- TicketNumber - ⚡ Номер электронного билета
- VoidTimelimitUtc - Время для аннулирования без штрафа
8️⃣ Просмотр состояния заказа
Независимо от статуса, вы всегда можете получить актуальные данные о заказе.
📥 Ключевые поля запроса:
- booking_id (integer) - BookingID для просмотра
- currency (string) - Валюта для ценовых компонентов
📤 Ключевые поля ответа:
- Order - Полная информация о заказе
- Ticket - Массив выписанных билетов (если есть)
9️⃣ Отмена заказа
📥 Ключевые поля запроса:
- booking_id (integer) - BookingID заказа для отмены
📤 Ключевые поля ответа:
- status - Статус выполнения операции
- OperationStatus - Статус отмены (ожидается "Success")
- MixOrderID - ID отмененного заказа
⚠️ Коды ошибок веб-сервиса
Справочник кодов ошибок, которые могут возникнуть при работе с API. Ошибки разделены на категории для упрощения диагностики проблем.
📋 Общие положения
Под ошибками понимается:
- Ошибки (error) - означающие неуспешное выполнение той или иной операции. Ошибки носят глобальный контекст.
- Предупреждения (warning) - означающие либо частичное выполнение операции, либо сообщение о невозможности выполнения операции согласно установленным бизнес-процессам, что ошибкой не является.
Уровни ошибок:
AVS API предусматривает 2 уровня для передачи ошибок:
Сюда относятся ошибки, связанные с:
- Нарушением формата запроса
- Авторизацией (запрос не авторизован)
- Ошибки, когда запрос полностью не обработан
- Ошибки, связанные с логической проверкой запроса и результатами обработки запроса, такие как:
- неверные даты вылета
- отрицательное количество пассажиров
- несуществующие станции
- отсутствующий контент
- и пр.
Запрос обработан, результат передан, но с рядом ограничений.
Структура ошибок:
Все ошибки возвращаются в следующем формате JSON:
{
"detail": {
"error": {
"code": "ERROR_CODE",
"message": "Описание ошибки"
}
}
}
{
"detail": {
"error": {
"code": "ERROR_CODE",
"message": "Описание ошибки",
"details": [ /* дополнительная информация */ ]
}
}
}
| Код | Тип | Описание |
|---|---|---|
| AUTH_1000 | Authentication | Неверный логин или пароль |
| AUTH_1001 | Authentication | Ваш аккаунт деактивирован |
| AUTH_1002 | Authentication | Доступ запрещен с данного IP-адреса |
| AUTH_1003 | Authentication | Неверный API-ключ |
| AUTH_1004 | Authentication | Пользователь не найден |
| AUTH_1005 | Authentication | Неверный токен авторизации |
| Код | Тип | Описание |
|---|---|---|
| ERR_1000 | Internal | Внутренняя ошибка сервера |
| ERR_1001 | BadRequest | Валюта не разрешена |
| ERR_1002 | NotFound | Предложение не найдено |
| ERR_1003 | NotFound | Не найден курс для валютной пары |
| ERR_1004 | BadRequest | Не указаны разрешенные валюты для пользователя |
| ERR_1005 | NotFound | Не найдены API данные для пользователя |
| ERR_1006 | BadRequest | Не существует временная зона |
| ERR_1007 | Internal | Ошибка при конвертации времени |
| ERR_1008 | BadRequest | Ошибка при парсинге даты |
| ERR_1009 | NotFound | Кошелек не найден |
| ERR_1010 | NotFound | Заказ не найден |
| ERR_1011 | BadRequest | Кредитный лимит превышен |
| ERR_1012 | Internal | Ошибка подключения к базе данных |
| ERR_1013 | BadRequest | Один или несколько обязательных параметров равны None |
| ERR_1014 | Internal | Ошибка обновления баланса |
| ERR_1015 | Internal | Ошибка получения информации о балансе |
| ERR_1016 | Internal | Ошибка при получении API данных |
| ERR_1017 | Internal | Произошла ошибка при создании Client |
| ERR_1018 | Forbidden | Доступ к эндпоинту запрещен |
| ERR_1019 | Forbidden | Доступ запрещен к заказу |
✈️ Ошибки провайдера (MIX)
| Код | Тип | Описание |
|---|---|---|
| MIX-101001 | Auth | InvalidUsernameOrPassword - Неверный логин или пароль |
| MIX-101002 | Auth | AuthenticationFailed - Аутентификация не удалась |
| MIX-101002 | Auth | AuthenticationFailed - Вам не доступен данный функционал. Обратитесь в поддержку |
| Код | Тип | Описание |
|---|---|---|
| MIX-100000 | BadRequest | BadXmlRequest - Некорректный XML запрос |
| MIX-100001 | BadRequest | EnvelopeValidation - Структура запроса не соответствует XSD |
| MIX-100003 | BadRequest | DictionaryItemNotFound - Элемент словаря отсутствует в кодификаторах |
| MIX-100004 | BadRequest | OfferNotFound - Предложения не найдены или срок действия истек |
| MIX-100007 | BadRequest | OperationNotAllowed - Метод запрещен |
| MIX-100008 | Internal | OperationCancelledByUser - Запрос отменен пользователем |
| MIX-110000 | BadRequest | RequestNotSupportedByProvider - Запрос не поддерживается провайдером |
| MIX-110000 | BadRequest | RequestNotSupportedByProvider - Указанная валюта не поддерживается |
| MIX-110001 | BadRequest | CurrencyNotAllowed - Валюта не установлена для Подразделения |
| MIX-110001 | BadRequest | CurrencyNotAllowed - Никакая валюта не установлена для Подразделения |
| MIX-113001 | BadRequest | Concurrency - Над ресурсом происходит параллельное выполнение операции |
| MIX-200002 | Internal | InternalServiceError - Внутренняя ошибка сервиса |
| MIX-200003 | BadRequest | OperationNotImplementedByProviderException - Операция не поддерживается |
| MIX-201999 | Internal | ServiceTemporarilyUnavailable - Сервис временно недоступен |
| MIX-103045 | BadRequest | Заказ занят другим пользователем. Повторите операцию позже |
| Код | Тип | Описание |
|---|---|---|
| MIX-100006 | BadRequest | UnsupportedRequest - FlightRequest может содержать максимум 2 OriginDestCriteria |
| MIX-100006 | BadRequest | UnsupportedRequest - Поиск с использованием Mixvel_LocationID не поддерживается |
| MIX-100006 | BadRequest | UnsupportedRequest - Множественное указание промокодов не поддерживается |
| MIX-100006 | BadRequest | UnsupportedRequest - Суммарное значение диапазонов дат не должно превышать лимит |
| MIX-100006 | BadRequest | UnsupportedRequest - Количество младенцев превышает максимальное на одного взрослого |
| MIX-100006 | BadRequest | UnsupportedRequest - Обязательно заполнение OwnerCode для каждой программы |
| MIX-100006 | BadRequest | UnsupportedRequest - Для одного OwnerCode указано несколько ProgramCriteria |
| MIX-100006 | BadRequest | UnsupportedRequest - Для поиска по бренду нужен фильтр по АК для каждого сегмента |
| MIX-100006 | BadRequest | UnsupportedRequest - OriginDestRefID не привязан к OriginDestCriteria |
| MIX-100006 | BadRequest | UnsupportedRequest - В запросе не указано ни одного пассажира |
| MIX-100006 | BadRequest | UnsupportedRequest - Не указана категория пассажира |
| MIX-100006 | BadRequest | UnsupportedRequest - Недопустим одновременный ввод MaximumConnectionQty='0' и StationCriteria |
| MIX-103001 | BadRequest | ViolateDepartureDate - Диапазон даты вылета в прошлом |
| MIX-103001 | BadRequest | ViolateDepartureDate - Диапазон даты вылета указан некорректно |
| MIX-103002 | Warning | DateTimeNotAvailable - Дата недоступна |
| MIX-103003 | Warning | TooManySegments - Сложный маршрут. Сократите количество направлений |
| Код | Тип | Описание |
|---|---|---|
| MIX-100006 | BadRequest | UnsupportedRequest - OfferRequest может содержать только один Offer |
| Код | Тип | Описание |
|---|---|---|
| MIX-109003 | BadRequest | PassengerNotFound - Пассажиры с указанными идентификаторами не найдены |
| MIX-203001 | BadRequest | OfferIdIsNotActual - Запрашиваемые рейсы для OfferId неактуальны |
| Код | Тип | Описание |
|---|---|---|
| MIX-104011 | BadRequest | OffersAlreadyReservedError - Указанные предложения уже забронированы |
| MIX-104012 | BadRequest | InconsistentRequestError - У предложения в запросе отсутствует родитель |
| MIX-104012 | BadRequest | InconsistentRequestError - OfferItemId не является частью предложения |
| MIX-104012 | BadRequest | InconsistentRequestError - OfferItemId отсутствует в запросе |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxSegmentRefID не найден в бронируемом предложении |
| MIX-104012 | BadRequest | InconsistentRequestError - В запросе не указан ни один номер телефона |
| MIX-104012 | BadRequest | InconsistentRequestError - В запросе не указано ни одного контакта пассажира |
| MIX-104012 | BadRequest | InconsistentRequestError - В ремарке требуется/не требуется привязка к пассажиру |
| MIX-104012 | BadRequest | InconsistentRequestError - В ремарке требуется/не требуется привязка к сегменту |
| MIX-104012 | BadRequest | InconsistentRequestError - В ремарке требуется/запрещен пользовательский текст |
| MIX-104012 | BadRequest | InconsistentRequestError - Для программы лояльности обязательно указание PaxSegmentRefID |
| MIX-104012 | BadRequest | InconsistentRequestError - Бронирование с одной картой лояльности на несколько предложений не поддерживается |
| MIX-104012 | BadRequest | InconsistentRequestError - В предложениях используются разные формы оплаты |
| Код | Тип | Описание |
|---|---|---|
| MIX-100001 | BadRequest | EnvelopeValidation - Допустимо указывать одно из: AcceptOffer или DeleteOrderItemList |
| MIX-100001 | BadRequest | EnvelopeValidation - Операция возврата возможна только для оплаченных заказов |
| MIX-104012 | BadRequest | InconsistentRequestError - Предложение принадлежит другому родителю |
| MIX-104012 | BadRequest | InconsistentRequestError - Заказы не найдены в запрошенной мультикорзине |
| MIX-104012 | BadRequest | InconsistentRequestError - Заказ на статусе 'Оформлен'. Изменение данных пассажиров невозможно |
| MIX-104012 | BadRequest | InconsistentRequestError - Категория пассажира недоступна для добавления в бронирование |
| MIX-104012 | BadRequest | InconsistentRequestError - Ошибка при удалении данных пассажира. Операция недопустима |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxID нет в указанном заказе |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxID задвоен |
| MIX-104012 | BadRequest | InconsistentRequestError - ID контакта пассажира уже указан в заказе |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxRefID не найден в заказе |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxSegmentRefID не найден в заказе |
| MIX-104012 | BadRequest | InconsistentRequestError - Ремарка не найдена в заказе |
| MIX-104012 | BadRequest | InconsistentRequestError - Лояльность не найдена в заказе. Выполните OrderRetrieve |
| MIX-104012 | BadRequest | InconsistentRequestError - Указанный для изменения документ не найден |
| MIX-104012 | BadRequest | InconsistentRequestError - Итоговая стоимость расчета на возврат изменилась. Повторите расчет |
| MIX-104012 | BadRequest | InconsistentRequestError - Заказ не связан с пассажиром |
| MIX-104012 | BadRequest | InconsistentRequestError - Ручной возврат возможен только для всех пассажиров заказа |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxID, PaxSegmentID задвоен |
| MIX-104012 | BadRequest | InconsistentRequestError - Для ручного обмена/возврата передавайте сегменты из OrderReshopRQ |
| MIX-104012 | BadRequest | InconsistentRequestError - Оценка ручного обмена/возврата произведена на все сегменты заказа |
| MIX-104012 | BadRequest | InconsistentRequestError - Запрещено использовать негативные величины в ручном возврате |
| MIX-104012 | BadRequest | InconsistentRequestError - Запрещено использовать TaxOperationType.Move в ручном возврате |
| MIX-104012 | BadRequest | InconsistentRequestError - Ручной возврат возможен только для расчёта в ручном режиме |
| MIX-104012 | BadRequest | InconsistentRequestError - Автоматический возврат возможен только для расчёта в автоматическом режиме |
| MIX-104012 | BadRequest | InconsistentRequestError - OrderItem не ассоциирован с EMD |
| MIX-104012 | BadRequest | InconsistentRequestError - Для операции ручного возврата EMD передавайте OrderItem из OrderReshopRQ |
| MIX-104012 | BadRequest | InconsistentRequestError - Операция недопустима для OrderItemID |
| MIX-100209 | BadRequest | InvalidSirenaUpgrade - Цена за повышение класса изменилась |
| Код | Тип | Описание |
|---|---|---|
| MIX-104012 | BadRequest | InconsistentRequestError/NoOrdersToCancel - Купон EMD для OrderItem отсутствует |
| MIX-106001 | BadRequest | NoOrdersToCancel - Мультикорзина не содержит заказов для отмены |
| MIX-106001 | BadRequest | NoOrdersToCancel - Заказ не содержит EMD купонов для отмены |
| MIX-106002 | BadRequest | OrderStatusMismatchError - Заказ был изменен, воспользуйтесь OrderRetrieve |
| Код | Тип | Описание |
|---|---|---|
| MIX-104012 | BadRequest | InconsistentRequestError - Не указана форма оплаты |
| MIX-104012 | BadRequest | InconsistentRequestError - Документ с типом не найден у пассажира |
| MIX-104012 | BadRequest | InconsistentRequestError - PaxSegmentID задвоен |
| MIX-104012 | BadRequest | InconsistentRequestError - Заказ не имеет оплаченных билетов для обмена |
| MIX-104012 | BadRequest | InconsistentRequestError - Заказ должен быть оплачен для оценки возврата |
| MIX-104012 | BadRequest | InconsistentRequestError - Указание формы оплаты при возврате запрещено |
| MIX-109001 | BadRequest | PartialRefundNotSupported - Оценка возврата возможна только для полностью оплаченной Мультикорзины |
| MIX-109002 | BadRequest | OrderIsNotRefundable - Возврат заказа не разрешен |
| MIX-109003 | BadRequest | PassengerNotFound - Пассажир не найден |
| MIX-109003 | BadRequest | PassengerNotFound - Расчёт на обмен разрешён только для одного пассажира |
| MIX-109004 | BadRequest | OrderIsAlreadyRefunded - Заказ уже был возвращен |
| MIX-109005 | BadRequest | MixOrderHasNoOrderToRefund - В Мультикорзине отсутствуют заказы для возврата |
| MIX-100111 | BadRequest | OrderUnPayed - Заказ не оплачен. Услуга повышения класса недоступна |
| MIX-100211 | BadRequest | InvalidUpgradeTime - Услуга повышения класса доступна не ранее 24 часов до вылета |
| MIX-100212 | BadRequest | InvalidPricingForUpgrade - Цена за повышение класса изменилась |
| MIX-100213 | BadRequest | NoSvcForUpgrade - Услуга повышения класса не предоставляется |
| MIX-100214 | BadRequest | NotEnoughSeats - Повышение класса невозможно для всех пассажиров в заказе |
| MIX-100215 | BadRequest | OfferHasExpired - Истекло время действия предложения |
| MIX-100216 | BadRequest | CommonErrorUpgrade - Не удалось провести процедуру Upgrade |
| MIX-100217 | BadRequest | InconsistentRequestError - OfferId не принадлежит Upgrade |
| MIX-100218 | BadRequest | InvalidUpgradeByMiles - Повышение класса за мили недоступно |
| MIX-100219 | BadRequest | NotEnoughQuotas - Нет квоты на перевозку животного в более высоком классе |
| MIX-100220 | BadRequest | ConflictingServicesError - Несовместимая услуга «ЖИВОТНОЕ НА СОСЕД КРЕСЛЕ» |
| MIX-100221 | BadRequest | ConflictingServicesError - Несовместимая услуга «ДОПОЛНИТЕЛЬНОЕ МЕСТО» |
| MIX-100222 | BadRequest | ConflictingServicesError - Несовместимая услуга «БАГАЖ В САЛОНЕ» |
| MIX-100223 | BadRequest | ConflictingServicesError - Несовместимая услуга «Несопровождаемый ребенок» |
| Код | Тип | Описание |
|---|---|---|
| MIX-100005 | BadRequest | OrderNotFound - Заказ не найден или срок действия истек |
| MIX-100005 | BadRequest | OrderNotFound - Заказы не найдены или срок действия истек |
| MIX-111001 | BadRequest | MixOrderNotFound - Мультикорзина не найдена |
| MIX-111003 | BadRequest | OrderNotFoundByTicket - Заказ по номеру билета не найден |
| MIX-111004 | BadRequest | OrdersNotInMixOrder - Указанные заказы не содержатся в Мультикорзине |
| MIX-111009 | BadRequest | OrderIsNotAvailable - Заказ перенесен в архив. Нет доступа |
| MIX-111011 | BadRequest | OrderIsBrokenForView - Невозможно отобразить текущее состояние заказа |
| Код | Тип | Описание |
|---|---|---|
| MIX-103007 | Warning | ItineraryReceiptCantGetSegmentsStatus - Билеты оформлены, но не удалось получить данные Маршрут-квитанций/EMD |
| MIX-103022 | Warning | PricedOfferMayContainChangedBrands - Возможно изменение брендов в PricedOffer |
| MIX-103023 | Warning | PartialPaymentNotification - Выполнена частичная оплата мультикорзины |
| MIX-103027 | Warning | PaxDataNotMatch - Данные пассажира в заказе не соответствуют данным в билете |
| MIX-103028 | Warning | SegmentsDataNotMatch - Данные маршрута в заказе не соответствуют купонам в билете |
| MIX-103033 | Warning | CouponLuggageNotEqualsSegmentLuggage - Данные багажа купона не совпадают с сегментом |
| MIX-103034 | Warning | ProviderPaxDataOutdated - Устаревшая информация по пассажиру. Обратитесь к поставщику |
| MIX-103200 | Warning | ExchangeRequestThresholdExceeded - Слишком много вариантов обмена. Конкретизируйте запрос |
| MIX-103202 | Warning | ExchangePricingWithoutResponse - Не удалось оценить некоторые варианты обмена |
| MIX-103204 | Warning | FareRequestThresholdExceeded - Слишком много вариантов тарифов. Конкретизируйте запрос |
| MIX-11205 | Warning | FromProviderError - Заказы не были созданы по следующим предложениям |
| MIX-11206 | Warning | FromInternalError - Операция с мультикорзиной выполнена частично |
⚠️ Важные примечания к специфическим ошибкам
Говорит о наличии ограничений бронирования со стороны хоста. Данные ограничения устанавливает авиакомпания (АК).
Говорит о том, что либо рейс закрыт, либо нет мест. Ответ также приходит от авиакомпании (АК).
Говорит о том, что возникла ошибка дублирования номера билета/документа на стороне ТКП/перевозчика. Рекомендация: повторите запрос оплаты/выпуска билета.