Всё об API поиска, который позволяет получать ответы в реальном времени и строить сложные маршруты.
API поиска билетов от Aviasales позволяет получать результаты запросов в режиме реального времени, а также строить сложные маршруты.
Уважаемые партнёры! Обратите внимание, что по умолчанию установлено ограничение: 100 запросов в час с одного пользовательского IP-адреса. Если требуется обрабатывать больше запросов, напишите на support@travelpayouts.com.
Условия использования API для поиска авиабилетов
- Каждый поисковый запрос должен быть инициирован пользователем, результат запроса должен быть показан пользователю в полном объёме. В результатах каждого запроса должна быть кнопка «купить» рядом с каждым найденным вариантом.
- Ссылка для перехода на агентство может быть сгенерирована ТОЛЬКО после нажатия на кнопку «Купить» пользователем. Автоматическая генерация данной ссылки запрещена.
- Коэффициент конверсии поисков в клики по кнопке «Купить» не должен быть ниже 9%. Конверсия кликнувших «Купить» в покупателей — не ниже 5%.
- Запрещено использовать запросы с localhost IP адресами (127.0.0.1-127.255.255.255).
- Ajax-запросы к API не работают, так как в открытом виде передаётся токен доступа. Необходимо делать запросы к API поискового сервиса авиабилетов с сервера, на клиенте сделать это не получится.
Сервис поиска авиабилетов не включает API бронирования авиабилетов. Покупка билетов осуществляется на сайтах агентств и авиакомпаний. Подробнее про условия использования и получение доступа к API поиска авиабилетов смотрите здесь.
Поисковая логика
- Формируете запрос с направлением перелёта и количеством пассажиров.
- Отправляете запрос и получаете уникальный ID поиска.
- Отправляете ID поиска, чтобы получить данные о рейсах и стоимость билетов.
- С помощью полученных данных формируете поисковую страницу.
- При клике на кнопку Купить генерируете ссылку на сайт агентства/авиакомпании.
Запросы
Туда-обратно (round trip)
Инициализация поиска
Метод: POST
Параметры запроса
- marker (string) — партнёрский маркер — это пять уникальных цифр, по которым мы понимаем от какого партнёра пришел пользователь (находится в личном кабинете партнёра);
- host (string) — хост автора запроса (необходимо заменить на адрес вашего сайта или название приложения, в котором используется API);
- user_ip (string) — IP-адрес пользователя (запрещено указывать localhost IP-адреса);
- locale (string) — язык, на котором отобразится результат запроса (от локали, города вылета и прилёта зависит, по каким агентствам осуществляется поиск). Доступные языки:
- en (en-us) — американский английский;
- en-gb — британский английский;
- ru — русский;
- de — немецкий;
- es — испанский;
- fr — французский;
- it — итальянский;
- pl — польский;
- th — таиландский.
- trip_class (string) — класс перелёта (Y — эконом, C — бизнес. Обязательно в верхнем регистре);
- passengers — информация о пассажирах;
- adults (integer) — количество взрослых;
- children (integer) — количество детей (возраст от 2 до 12 лет);
- infants (integer) — количество младенцев (возраст до 2 лет).
- segments
- origin (string) — IATA-код пункта отправления. IATA-код указывается буквами верхнего регистра, например, MOW;
- destination (string) — IATA-пункта назначения. IATA-код указывается буквами верхнего регистра, например, MOW;
- date (string) — дата отправления.
- know_english (string) (необязательный параметр) — параметр, отвечающий за наличие англоязычных гейтов в выдаче. Принимаемые значения: true (в случае, если надо отобразить пользователю англоязычные гейты), false (по умолчанию false);
- currency (string) (необязательный параметр) — валюта (по умолчанию rub), в которой отобразится цена билета в ответе, так же в этой валюте будет цена после перехода на сайт агентства (при условии, что агентство поддерживает данную валюту);
- signature (string) — md5-подпись запроса, которая получается из сгруппированного в алфавитном порядке списка параметров запроса. Узнайте, как сформировать signature.
Чтобы получить варианты билетов «Туда-обратно», необходимо добавить следующий код в body запроса:
{ "signature":"55b47124341b5bed8627499b0eb5de80", "marker":"ВашМаркер", "host":"%server_host%", "user_ip":"%user_ip_address%", "locale":"ru", "trip_class":"Y", "passengers":{ "adults":1, "children":0, "infants":0 }, "segments":[ { "origin":"NYC", "destination":"LAX", "date":"2017-11-25" }, { "origin":"LAX", "destination":"NYC", "date":"2017-12-18" } ] }
Для получения данных запустите код инициализации поиска (обратите внимание, что в примере указаны параметры marker, host, user_ip, которые необходимо заменить на ваши, описание параметров см. выше):
curl -v -X POST -d '{"signature":"deb5b02159898a6ab6f120624fa2f72c","marker":"ВставьтеСюдаВашМаркер","host":"beta.aviasales.ru","user_ip":"127.0.0.1","locale":"ru","trip_class":"Y","passengers":{"adults":1,"children":0,"infants":0},"segments":[{"origin":"NYC","destination":"LAX","date":"2017-11-25"},{"origin":"LAX","destination":"NYC","date":"2017-12-18"}]}' -H 'Content-type:application/json' http://api.travelpayouts.com/v1/flight_search
В результате будет получен ответ в формате JSON. Ответ содержит следующие параметры:
- locale — локаль, на языке которой отображается результат поиска;
- search_id — уникальный идентификатор поиска, используется для запроса результатов поиска;
- geoip_city — geoip города, из которого сделан запрос;
- trip_class — класс перелёта;
- affiliate — id партнёра;
- marker — маркер, с которым был сделан поиск;
- user_ip — ip-адрес пользователя;
- gates_count — общее кол-во агентств;
- segments — список составляющих перелёта:
- date — дата вылёта;
- origin — IATA-код пункта отправления;
- destination — IATA-пункта назначения;
- meta — техническая информация;
- uuid — уникальный идентификатор запроса;
- passengers — информация о пассажирах:
- adults — количество взрослых;
- infants — количество младенцев;
- children — количество детей;
- host — хост, откуда был получен запрос;
- currency_rates — курс валют по отношению к рублю. Используйте для отображения стоимости билета в других валютах;
- geoip_country — geoip страны, из которого сделан запрос;
- banner_info — служебная информация (просто игнорируйте данный блок);
- preroll_question — блок с вопросами, которые отображаются при поиске на сайте aviasales (просто игнорируйте данный блок).
Получение результатов поиска
Метод: GET
В теле ответа содержится параметр search_id, который необходимо вставить в URL:
http://api.travelpayouts.com/v1/flight_search_results?uuid=%search_id%
И отправить запрос на сервер за результатами поиска:
curl -v -H 'Accept-Encoding:gzip,deflate,sdch' http://api.travelpayouts.com/v1/flight_search_results?uuid=ebe4fa71-bc07-40df-ae4e-4b72116583da --compressed
где «ebe4fa71-bc07-40df-ae4e-4b72116583da» — это и есть search_id.
В результате будут получены данные в виде JSON массива, где каждый proposal-элемент — это билет от конкретного агентства. Описание ответа см. ниже.
Чтобы получить все данные, запрос необходимо повторять, пока в ответе не придёт ассоциативный массив с одним элементом — search_id. Периодичность отправки запросов никак не ограничена.
Обратите внимание! На сбор данных нашим сервером требуется время (от 30 до 60 секунд). Вы можете сделать задержку после получения параметра search_id и уведомить пользователя, что идет загрузка — так сделано на сайте aviasales.ru. Или выводить данные на странице, по мере их получения от нас.
Билеты в одну сторону
Инициализация поиска
Метод: POST
Поиск билетов в одну сторону происходит по аналогичной схеме с поиском «Туда-обратно». Единственное отличие — это содержимое JSON-запроса. Для инициализации поиска необходимо поместить следующий JSON в body запроса:
{ "marker": "ВставьтеСюдаВашМаркер", "host": "beta.aviasales.ru", "user_ip": "127.0.0.1", "locale": "ru", "trip_class": "Y", "passengers": "adults": 1, "children": 0, "infants": 0 }, "segments": [ { "origin": "MOW", "destination": "LED", "date": "2017-12-18" }] }
Инициируйте поиск, используя приведенный выше запрос:
curl -v -X POST -d '{"signature":"2a3e1bda117d113569bb6f8b60dba075","marker":"ВставьтеСюдаВашМаркер","host":"beta.aviasales.ru","user_ip":"127.0.0.1","locale":"ru","trip_class":"Y","passengers":{"adults":1,"children":0,"infants":0},"segments":[{"origin":"MOW","destination":"LED","date":"2017-12-18"}]}' -H 'Content-type:application/json' http://api.travelpayouts.com/v1/flight_search
Получение результатов поиска
Метод: GET
В теле ответа содержится параметр search_id, который нужно поместить в URL:
http://api.travelpayouts.com/v1/flight_search_results?uuid=%search_id%
После чего отправить запрос на сервер за результатами поиска:
curl -v -H 'Accept-Encoding:gzip,deflate,sdch' http://api.travelpayouts.com/v1/flight_search_results?uuid=%search_id% --compressed
В результате будут получены данные в виде JSON массива, где каждый proposal-элемент — это билет от конкретного агентства. Описание ответа см. ниже.
Чтобы получить все данные, запрос необходимо повторять, пока в ответе не придёт ассоциативный массив с одним элементом — search_id. Периодичность отправки запросов никак не ограничена.
Обратите внимание! На сбор данных нашим сервером требуется время (от 30 до 60 секунд). Вы можете сделать задержку после получения параметра search_id и уведомить пользователя, что идет загрузка — так сделано на сайте aviasales.ru. Или выводить данные на странице, по мере их получения от нас.
Составной маршрут
Инициализация поиска
Метод: POST
Составные маршруты — это маршруты с несколькими последовательными перелетами из одного города в другой. Например, Москва — Санкт-Петербург — Берлин — Лондон.
Для инициализации поиска необходимо поместить данный JSON в body запроса:
{ "signature":"64dd4ff2f8a6f690b69d6a72429bf827", "marker":"ВставьтеСюдаВашМаркер", "host":"beta.aviasales.ru", "user_ip":"127.0.0.1", "locale":"ru", "trip_class":"Y", "passengers":{ "adults":1, "children":0, "infants":0 }, "segments":[ { "origin":"MOW", "destination":"LED", "date":"2017-12-18" }, { "origin":"LED", "destination":"BER", "date":"2017-12-25" }, { "origin":"BER", "destination":"LON", "date":"2017-01-05" }] }
После чего инициируйте поиск:
curl -v -X POST -d '{"signature":"08caa94413dc805880f835ba9d8ba98f","marker":"ВставьтеСюдаВашМаркер","host":"beta.aviasales.ru","user_ip":"127.0.0.1","locale":"ru","trip_class":"Y","passengers":{"adults":1,"children":0,"infants":0},"segments":[{"origin":"MOW","destination":"LED","date":"2017-11-18"},{"origin":"LED","destination":"BER","date":"2017-12-25"},{"origin":"BER","destination":"LON","date":"2017-01-05"}]}' -H 'Content-type:application/json' http://api.travelpayouts.com/v1/flight_search
Получение результатов поиска
Метод: GET
В теле ответа содержится параметр search_id. Поместите его в URL:
http://api.travelpayouts.com/v1/flight_search_results?uuid=%search_id%
И отправьте запрос на сервер за результатами поиска:
curl -v -H 'Accept-Encoding:gzip,deflate,sdch' http://api.travelpayouts.com/v1/flight_search_results?uuid=%search_id% --compressed
В результате будут получены данные в виде JSON массива, где каждый proposal-элемент — это билет от конкретного агентства. Описание ответа см. ниже.
Чтобы получить все данные, запрос необходимо повторять, пока в ответе не придёт ассоциативный массив с одним элементом — search_id. Периодичность отправки запросов никак не ограничена.
Обратите внимание! На сбор данных нашим сервером требуется время (от 30 до 60 секунд). Вы можете сделать задержку после получения параметра search_id и уведомить пользователя, что идет загрузка — так сделано на сайте aviasales.ru. Или выводить данные на странице, по мере их получения от нас.
Содержимое ответа API поиска
Пример ответа
Обратите внимание! Ссылка на результаты поиска действует 15 минут. По истечению этого времени поисковый запрос нужно отправлять заново.
[{ "segments":[{ "destination_country":"RU", "original_destination":"LED", "origin":"MOW", "origin_country":"RU", "original_origin":"MOW", "date":"2017-11-25", "destination":"LED" }, { "destination_country":"RU", "original_destination":"MOW", "origin":"LED", "origin_country":"RU", "original_origin":"LED", "date":"2017-12-18", "destination":"MOW" }], "banner_info":{ }, "internal":false, "airports":{ "LED":{ "name":"Пулково", "time_zone":"Europe/Moscow", "country":"Россия", "rates":"259", "city":"Санкт-Петербург" }, "DME":{ "name":"Домодедово", "time_zone":"Europe/Moscow", "country":"Россия", "rates":"392", "city":"Москва" }, "SVO":{ "rates":"307", "country":"Россия", "name":"Шереметьево", "average_rate":"3.63", "city":"Москва", "time_zone":"Europe/Moscow" }, "VKO":{ "name":"Внуково", "time_zone":"Europe/Moscow", "country":"Россия", "rates":"211", "city":"Москва" }}, "gates_info":{ "20":{ "average_rate":4.43, "rates":2967, "currency_code":"rub", "is_airline":false, "label":"OneTwoTrip", "airline_iatas":{ }, "payment_methods":[ "card" ], "mobile_version":false }}, "city_distance":634, "meta":{ "uuid":"c9c6de8c-3fb4-404e-b88c-e9e0a605f183", "gates":[{ "duration":22.402996063232422, "id":20, "count":1456, "good_count":1456 }]}, "airlines":{ "SU":{ "average_rate":"4.01", "rates":"2362", "alliance_name":"SkyTeam", "name":"Аэрофлот", "id":10 }, "UN":{ "average_rate":"3.98", "rates":"2639", "alliance_name":null, "name":"Трансаэро", "id":492 }, "S7":{ "average_rate":"3.95", "rates":"2430", "alliance_name":"OneWorld", "name":"S7", "id":444 }, "UT":{ "rates":"1843", "alliance_name":null, "name":"ЮТэйр", "id":507 }, "U6":{ "average_rate":"3.62", "rates":"1158", "alliance_name":null, "name":"Уральские авиалинии", "id":503 }}, "filters_boundary":{ "arrival_datetime_0":{ "min":1418869200, "max":1418950500 }, "arrival_datetime_1":{ "min":1419486600, "max":1419554400 }, "flights_duration":{ "min":70, "max":120 }, "stops_count":{ "0":4431 }, "departure_time_1":{ "min":"04:30", "max":"22:55" }, "departure_time_0":{ "min":"00:50", "max":"23:30" }, "departure_minutes_0":{ "min":50, "max":1410 }, "departure_minutes_1":{ "min":270, "max":1375 }, "price":{ "min":4431, "max":8689 }}, "flight_numbers":[ [ "SU30", "SU32" ], [ "SU31", "SU33" ]], "proposals":[{ "terms":{ "20":{ "url":2000000, "unified_price":5867, "price":5867, "currency":"rub" }}, "sign":"7573ea707c2ff84b243241961412ed34", "segment":[{ "flight":[{ "arrival":"LED",
"aircraft":"AIRBUS A320",
"local_departure_timestamp":1434588600, "operating_carrier":"UT",
"operated_by":"S7", "duration":85,
"local_arrival_timestamp":1432549200, "departure_date":"2016-11-25", "departure_time":"11:00",
"departure_timestamp":1608810900, "arrival_date":"2016-11-25", "arrival_time":"12:25",
"arrival_timestamp":1608813600, "delay":0, "departure":"VKO",
"equipment":"E70",
"marketing_carrier":"",
"rating":7.786111111111111,
"technical_stops":null,
"trip_class":"Y" "number":369 }]}, { "flight":[{ "aircraft":"Boeing 737-800 (winglets)",
"arrival":"SVO",
"arrival_date":"2020-12-24",
"arrival_time":"07:30",
"arrival_timestamp":1608784200,
"delay":0,
"departure":"BAX",
"departure_date":"2020-12-24",
"departure_time":"06:55",
"departure_timestamp":1608767700,
"duration":275,
"equipment":"73H",
"local_arrival_timestamp":1608795000,
"local_departure_timestamp":1608792900,
"marketing_carrier":"SU",
"number":"1431",
"operating_carrier":"SU",
"operated_by":"SU",
"rating":8.23125,
"technical_stops":null,
"trip_class":"Y" }],
"rating":{
"total":9.45,
"detailed":{
"arrival_time":9.375,
"departure_time":7.875000000000001,
"transfer":10
}
},
"transfers":[{
"at":"OVB",
"to":"OVB",
"airports":[
"OVB"
],
"airlines":[
"S7"
],
"country_code":"RU",
"city_code":"OVB",
"visa_rules":{
"required":false
},
"night_transfer":false,
"duration_seconds":3600,
"duration":{
"seconds":3600
}}]
}]}, { "terms":{ "20":{ "url":2000001, "unified_price":6953, "price":6953, "currency":"rub" }]}], "validating_carrier": "SU" }], "_ga":null, "signature":"4bb635b9353a1e933907d41841e23414", "search_id":"c9c6de8c-3fb4-404e-b88c-e9e0a605f183" }, { "search_id":"c9c6de8c-3fb4-404e-b88c-e9e0a605f183" }]
Полный пример ответа: response-example.json.
Ответ содержит следующие данные:
- search_id — идентификатор поиска;
- flight_numbers — номера рейсов;
- uuid — идентификатор поиска;
- city_distance — расстояние между городами отправления и назначения;
- gates_info — информация об агенте, продавце билетов. Цифра — id гейта.
- gates_info.[id].currency_code — код валюты оплаты;
- gates_info.[id].is_airline — true если билет продает авиакомпания;
- gates_info.[id].average_rate — средний рейтинг агентства;
- gates_info.[id].rates — рейтинг агентства (кол-во проголосовавших);
- gates_info.[id].mobile_version — наличие мобильной версии сайта;
- gates_info.[id].airline_iatas — IATA код авиакомпании, если билеты продает она сама;
- gates_info.[id].payment_methods — способы оплаты;
- gates_info.[id].working_hours — дни и часы работы агентства;
- gates_info.[id].email — адрес электронной почты (deprecated);
- gates_info.[id].phone — номер телефона (deprecated);
- gates_info.[id].site — сайт агентства;
- gates_info.[id].helplink — ссылка на сайт с помощью;
- gates_info.[id].label — название агентства.
- signature — сигнатура запроса;
- segments — массив данных о перелетах (deprecated):
- segments.destination_country — код страны назначения;
- segments.original_destination — код города назначения;
- segments.origin — IATA-код пункта отправления;
- segments.destination — IATA-пункта назначения;
- segments.date — дата вылета.
- flight_numbers — номера рейсов;
- airlines — информация об авиакомпании:
- airlines.deeplink_site_name — адрес сайта авиакомпании;
- airlines.id — идентификационный номер;
- airlines.site_name — название сайта авиакомпании;
- airlines.alliance_name — альянс, в который входит авиакомпания;
- airlines.average_rate — средний рейтинг;
- airlines.rates — количество оценок;
- airlines.deeplink_id — id ссылки на сайт авиакомпании;
- airlines.name — название.
- proposals — массив найденных вариантов;
- proposals.segment — сегменты перелета;
- proposals.segment.flight — информация о рейсе:
- proposals.segment.flight.departure — IATA код аэропорта отправления;
- proposals.segment.flight.duration — продолжительность перелета в минутах;
- proposals.segment.flight.departure_date — дата отправления;
- proposals.segment.flight.departure_time — время отправления по местному времени;
- proposals.segment.flight.departure_timestamp — время отправления в UNIX формате;
- proposals.segment.flight.local_departure_timestamp — местное время отправления в UNIX формате;
- proposals.segment.flight.arrival_date — дата прибытия;
- proposals.segment.flight.arrival_time — время прибытия по местному времени;
- proposals.segment.flight.arrival_timestamp — время прибытия в UNIX формате;
- proposals.segment.flight.local_arrival_timestamp — местное время прибытия в UNIX формате;
- proposals.segment.flight.aircraft — тип самолета;
- proposals.segment.flight.number — номер рейса (строковое значение). Чтобы сформировать полный номер рейса вида КодАвиакомпанииНомерРейса, используйте параметры operating_carrier и number;
- proposals.segment.flight.delay — время между рейсами (время ожидания в аэропорту) в минутах;
- proposals.segment.flight.marketing_carrier — IATA код авиакомпании, которая продаёт билет. Используйте, чтобы сформировать номер рейса. Если данное поле пустое, используйте operating_carrier;
- proposals.segment.flight.operating_carrier — IATA код авиакомпании, выполняющей перевозку;
- proposals.segment.flight.is_bus, flight.is_train — true, если в этом сегменте передвигаются не самолетом, а автобусом или поездом;
- proposals.segment.flight.technical_stops — IATA код аэропорта технической остановки;
- proposals.segment.flight.arrival — IATA код аэропорта прибытия.
- proposals.segment.rating — внутренняя информация о рейтинге полетов;
- proposals.segment.transfers — информация о пересадке:
- proposals.segment.transfers.at — IATA код аэропорта, в который прилетает самолёт для пересадки;
- proposals.segment.transfers.to — IATA код аэропорта, из которого вылетает самолёт;
- proposals.segment.transfers.airports — список IATA кодов аэропортов пересадки;
- proposals.segment.transfers.airlines — список IATA кодов авиакомпаний, участвующих в перелёте;
- proposals.segment.transfers.country_code — IATA код страны пересадки;
- proposals.segment.transfers.city_code — IATA код города пересадки;
- proposals.segment.transfers.visa_rules — требуется ли виза для российских граждан для пересадки;
- proposals.segment.transfers.night_transfer — является ли ночной пересадкой;
- proposals.segment.transfers.duration_seconds — продолжительность пересадки в секундах;
- proposals.segment.transfers.duration — deprecated.
- proposals.segment.flight — информация о рейсе:
- proposals.segment.carriers — iata код авиакомпаний перевозчиков;
- proposals.segment.terms — информация о стоимости перелета (цифра — id гейта):
- proposals.segment.terms.currency — валюта, в которой указана оригинальная цена;
- proposals.segment.terms.price — цена перелета в валюте гейта (указана в поле terms.currency);
- proposals.segment.terms.unified_price — цена перелета в базовой валюте (в рублях);
- proposals.segment.terms.url — код для формирования ссылки для покупателей (как формировать ссылку см. ниже);
- proposals.segment.terms.flights_baggage — количество мест багажа и его вес. Принимает одно из значений:
- terms.flights_baggage.flights_baggage."" — нет информации о багаже;
- terms.flights_baggage.flights_baggage.false — багаж не включен в стоимость;
- terms.flights_baggage.flights_baggage.0PC — нет багажа;
- terms.flights_baggage.flights_baggage.{int}PC{int} — количество сумок по %somevalue% килограмм. Например, 2PC23 означает два багажных места по 23 кг.
- terms.flights_baggage.flights_baggage.{int} — количество сумок не имеет значения, ограничивается суммарная масса.
- proposals.segment.terms.flights_handbags — информация о ручной кладе.
- proposals.segment.xterms — содержит информацию аналогичную terms, плюс может содержать дополнительные данные о тарифах (если она передаётся от агентств/авиакомпаний);
- proposals.segment.is_direct — true, если перелет без пересадок;
- proposals.segment.segments_airports — IATA коды основных аэропортов отправления и назначения;
- proposals.segment.stops_airports — IATA коды аэропортов отправления, назначения и пересадок;
- proposals.segment.is_charter — является ли рейс чартерным (false или true);
- proposals.segment.segment_durations — продолжительность перелетов (например, туда и обратно);
- proposals.segment.total_duration — общее время перелета;
- proposals.segment.max_stops — максимальное количество остановок;
- proposals.segment.sign — уникальный id билета, для объединения информации от разных агентств в один билет.
- proposals.segment — сегменты перелета;
- meta:
- gates — информация о ходе опроса агентств в процессе поиска;
- gates.tos — содержимое ошибки.
- gates.good_count — количество подходящих билетов (если есть билеты с неверной датой, то они отфильтровываются);
- gates.count — количество билетов от агентства;
- gates.duration — время запроса;
- gates.id — ID агентства;
- gates.error — информация об ошибке;
- gates.uuid — ID запроса;
- gates — информация о ходе опроса агентств в процессе поиска;
- airports — данные об аэропортах;
- airports.city — город, в котором находится аэропорт;
- airports.city_code — IATA код города;
- airports.average_rate — средний рейтинг аэропорта;
- airports.rates — количество оценок;
- airports.country — страна, в которой находится аэропорт;
- airports.name — название аэропорта;
- airports.time_zone — часовой пояс аэропорта;
- airports.IATA — IATA код аэропорта.
- market — рынок маршрутов (deprecated);
- initiated_at — дата и время поиска (deprecated);
- open_jaw — верно, если это часть составного маршрута (deprecated);
- clean_marker — партнёрский маркер (deprecated);
- currency — тип валюты (deprecated);
- filters_boundary — массив с данными для фильтрации (deprecated):
- filters_boundary.stops_duration — время между рейсами (максимальное и минимальное);
- filters_boundary.flights_duration — время перелета (максимальное и минимальное среди всех перелетов);
- filters_boundary.arrival_datetime_0 — время прибытия (максимальное и минимальное). Здесь 0, 1 в конце переменной означают номер перелёта (0 - туда, 1 - обратно);
- filters_boundary.price — цена перелета (максимальное и минимальное);
- filters_boundary.departure_time_0 — время отправления (максимальное и минимальное);
- filters_boundary.stops_count — количество пересадок от указанной минимальной стоимости.
- validating_carrier — IATA код основной авиакомпании (deprecated).
Совет: как определить аэропорт вылета и назначения.
Чтобы выяснить является ли аэропорт пунктом назначения или отправления, необходимо сопоставить данные из двух блоков. Первый — это airports, в нем указан IATA-код города, в котором расположен каждый аэропорт. Второй — блок flight, он содержит параметры arrival и departure — это IATA коды городов назначения и отправления.
Дополнительные данные в ответе
Ряд авиакомпаний и агентств отдают дополнительные данные о рейсах, самолетах и услугах на борту. Ниже описываются поля и их содержимое. Вы можете использовать эту информацию для отображения на сайте или игнорировать её — вся основная информация о билетах приведена выше.
- banner_info — служебная информация от авиакомпании;
- airlines/id/ — в ветке приводятся данные от конкретной авиакомпании (где id — это IATA код авиакомпании):
- seatType — тип места в самолете (Angle Lie Flat, Flat Bed — особое место, может раскладываться в кровать и прочее; Standard — обычное место);
- typeClass — тип класса (Business class, Economy class);
- seatWidth — ширина сиденья (в дюймах);
- aircraft — тип самолета;
- seatPitch — расстояние между сидениями (в дюймах);
- videoType — тип видео (Overhead TV — на впереди стоящем сиденье, On-Demand TV — общий ТВ с выдачей наушников по требованию, None — отсутствует);
- wifi — наличие Wi-Fi на борту;
- id — уникальный id самолета (служебный параметр);
- powerType — наличие розетки переменного тока в кресле;
- airline — IATA код авиакомпании;
- laptopPower — наличие розетки для ноутбука.
- excess — текстовая информация о максимальных ограничениях провоза багажа;
- checked — текстовая информация про оплаченный вес багажа и его размер, а так же про необходимость доплатить, если размеры больше;
- carryOn — текстовая информация о правилах перевоза ручной клади;
- airline — IATA код авиакомпании;
- sportMusical — правила перевозки крупных музыкальных и спортивных инструментов.
- mobileCheckIn — возможность регистрации через мобильное приложение;
- seatOnlineCheckIn — выбор места при регистрации;
- onlineCheckInwithBag — онлайн регистрация багажа;
- airline — IATA код авиакомпании;
- onlineCheckIn — правила онлайн регистрации;
- requirementOnlineCheckIn — правила онлайн регистрации;
- airportCheckIn — правила регистрации в аэропорту;
- timeBoardingGate — время на посадку до вылета
- cargo — перевозка в багаже;
- baggage — правила перевозки в багаже;
- restriction — ограничения;
- documentation — требуемая документация;
- book — бронирование;
- airline — IATA код авиакомпании;
- method — метод перевозки;
- cabin — информация по перевозке в салоне самолета;
- kennel — дополнительные требования;
- fee — информация о денежном сборе за провоз животных;
- age — возраст, до которого распространяется этот тариф;
- airline — IATA код авиакомпании;
- booking — информация о бронировании;
- aboutService — информация о сервисе;
- flightRestriction — информация об ограничениях;
- fee — денежный сбор за тариф.
- payInternational — информация о тарифе;
- exitRow — ограничения по выбору места на сиденьях рядом с запасным выходом;
- childTurnTwo — правила тарифа при перелете с несколькими пересадками;
- reserveSeat — информация о месте для младенце;
- payInfant — информация по оплате;
- airline — IATA код авиакомпании;
- baggage — багаж в билете для младенца;
- childRestraintDevices — информация по перевозки вещей младенца (коляска, сумка переноска и пр.);
- infantAmenitites — информация о дополнительных услугах в самолете для младенца;
- payDomestic — дополнительный сбор;
- jets — данные о самолетах авиакомпании:
- ageOfPlanes — средний возраст самолетов в авиакомпании;
- alliance — альянс, в который входит авиакомпания;
- economyLegroom — среднее расстояние между креслами в эконом классе (в дюймах);
- freeStandardCarryOn — наличие бесплатного места для ручной клади;
- infantsLapCost — возраст, с которого ребенок считается не младенцем;
- minorsNotTravelAloneFrom — возможность несовершеннолетним путешествовать в одиночку;
- iata — IATA код авиакомпании;
- checkedBaggagePrice1st — стоимость регистрации багажа;
- baggage — информация о багаже на рейсе;
- frequentFlyerPrograms — программа лояльности для клиентов;
- aircrafts — количество самолетов у авиакомпании;
- carryOnStandard — наличие стандарта перевозки ручной клади;
- lowcost — является ли лоукостером;
- freeCheckedBag — возможность бесплатной провозки багажа в пределе ограничений;
- meals — типы меню на рейсах авиакомпании;
- checkin — способы регистрации на рейсах авиакомпании;
- minorsNotTravelAloneTo — возраст несовершеннолетних, до которого нельзя путешествовать без взрослых;
- pet — информация по перевозке животных авиакомпанией;
- minor — информация о тарифе для подростков;
- infant — информация о тарифе для младенцев.
Лоукостеры в результатах поиска
В результатах поиска содержится ряд авиакомпаний и агентств, не умеющих работать с партнерским маркером. При продаже билетов через эти компании вознаграждение партнеру начислено не будет.
Вы можете по своему усмотрению оставлять билеты от данных компаний в результатах поиска или фильтровать их перед тем, как отобразить вашим пользователям. Однако имейте ввиду — это компании лоукостеры, т. е. у них, как правило, самые низкие цены на билеты. И если их убрать, поисковая выдача станет гораздо менее интересной для пользователей.
Список компаний, не поддерживающих работу с партнерским маркером:
- представлены на сайте aviasales.ru (локаль ru в API);
- представлены на сайте jetradar.com (локаль en).
Получение ссылки для перехода на сайт агентства
Внимание! Получение ссылки на сайт агентства может инициироваться только при нажатии пользователем кнопки «Купить». Автоматический сбор всех ссылок из ответа запрещен. Нарушение этого правила приводит к отключению API поиска у партнера.
Чтобы получить ссылку на сайт агентства для бронирования билетов, необходимо:
1. Отправить запрос на адрес:
http://api.travelpayouts.com/v1/flight_searches/search_id/clicks/terms.url.json?marker=ВашМаркер
где search_id — id поиска из ответа, terms.url — значение параметра url из ответа, marker — маркер партнёра.
2. В результате будет получен ответ вида:
{
"gate_id": 112,
"click_id": 1638059365479303264,
"str_click_id": "1638059365479303264",
"url": "https://www.flightnetwork.com/flights/showflight?cid=175&qid=b4efe7e975ff9eee42d420600345160e&utm_source=jetradar&utm_medium=3rdparty&client_ref=fnjtrus_tg2b&utm_campaign=metasearch¤cy=RUB&cmpid=3P-CPC-JTR-USA-XXX-FLT-MET-PYP-cg0zkzxavu5c-DIR-XXX-2014-01-28",
"method": "GET",
"params": {}
}
Для перехода к бронированию посетителю отдается ссылка из параметра url, то есть в нашем примере это ссылка вида:
https://www.svyaznoy.travel/?utm_source=aviasales.ru&utm_medium=cpa&utm_campaign=meta_avia#MOW0906/BKK1506/A1/C0/I0/S0/22316/EK-132;EK-374/EK-373;EK-131&marker=7uh46i0v2
Важно! Время «жизни» подобной ссылки 15 минут, после чего потребуется произвести поиск заново для получения актуальных цен и генерации новой ссылки на переход.
Особенности формирования ссылок на некоторые гейты
Ряд гейтов не отдают прямые ссылки, а передают данные в массиве params. Такие агентства содержат в массиве параметр method со значением «POST» (у обычных гейтов этот параметр равен «GET»). Пример такого ответа:
{ "params": { "FlightNumber1": "7793", "PointOfSaleCountry": "US", "Origin2": "BLQ", "UserLanguage": "en", "Adult": "1", "Destination2": "MLA", "DisplayedPriceCurrency": "EUR", "DepartureDate2": "2016-08-18", "Origin1": "MLA", "FlightNumber2": "7794", "ReferralId": "GoogleFlightSearch", "Destination1": "BLQ", "TripType": "RoundTrip", "UserCurrency": "RUB", "DisplayedPrice": "153.98", "BookingCode1": "Y", "Carrier1": "FR", "Cabin1": "Economy", "DepartureDate1": "2016-07-25", "BookingCode2": "Y", "Cabin2": "Economy", "Carrier2": "FR" }, "click_id": 56773565449083, "gate_id": "50", "method": "POST", "url": "https://www.bookryanair.com/SkySales/booking.aspx?utm_source=aviasales_ru" }
Чтобы перенаправить пользователя на сайт подобного агентства и отследить переход, необходимо сделать страницу-редирект.
Для отслеживания партнерского маркера, страница должна содержать такой код:
<img width="0" height="0" id="pixel" src="//yasen.aviasales.ru/adaptors/pixel_click.png?click_id=CLICK_ID&gate_id=GATE_ID">
где click_id — это значение параметра из массива с ответом (в примере выше этот параметр равен 56773565449083), gate_id — идентификатор гейта (в примере выше равен 50).
Чтобы изображение наверняка загрузилось, на странице добавляется пауза, во время которой пользователю отображается сообщение, что идет перенаправление на сайт агентства.
На странице добавляется так же проверка параметра method и в зависимости от результата выполняется один из сценариев:
- если метод GET — выполняется редирект по прямой ссылке из параметра url;
- если метод POST — формируется форма с параметрами из массива params и пользователь перенаправляется с этой страницы по ссылке из поля url в ответе выше.
Вариант страницы-редиректа, можно посмотреть здесь.
Обратите внимание! Так как логика работы агентств и авиакомпаний может меняться мы рекомендуем использовать пиксель вне зависимости от значения параметра method из ответа.
$('body').append(`<img src="//yasen.aviasales.ru/adaptors/pixel_click.png?click_id=${response.str_click_id}&gate_id=${response.gate_id}" width="0" height="0" id="pixel">`);
Логотипы авиакомпаний и агентств
Логотипы авиакомпаний доступны по адресу: https://pics.avs.io/width/height/iata.png
Логотипы агентств можно получить по адресу: https://pics.avs.io/as_gates/width/height/id.png
где width — ширина логотипа, height — высота логотипа, iata — IATA код авиакомпании. id — ID агентства из ответа поискового API (смотри поле terms — информация о стоимости перелета (цифра — id гейта)). Размер может быть любым.
Пример: https://pics.avs.io/200/200/UN.png.
Чтобы получить ретина вариант логотипа, используйте формат ссылки вида https://pics.avs.io/as_gates/width/height/id@2x.png