{"name":"Островок — ETG API (RateHawk)","vendor":"Emerging Travel Group (Островок)","industry":"travel","summary":"API Emerging Travel Group (Островок, RateHawk) версии V3 для бронирования отелей: поиск цен по региону, отелям или координатам, страница отеля со всеми тарифами, предбронирование, создание и завершение бронирования, проверка статуса, отмена, статический контент и дампы отелей. Есть B2B API (для турагентств) и Affiliate API; здесь — основные методы B2B. Перед использованием нужен договор, после интеграции может потребоваться сертификация.","docsUrl":"https://docs.emergingtravel.com/docs/overview/","coverage":{"included":[],"excluded":[]},"scenarios":[{"id":"nayti-oteli-i-tseny-v-gorode","title":"Найти отели и цены в городе","summary":"Поиск отелей на даты поездки: от строки «Сочи» до списка отелей с ценами и всех тарифов выбранного отеля.","steps":["Найди регион по названию: POST /api/b2b/v3/search/multicomplete/ с query (часть названия) и language. В ответе — до 5 регионов и отелей; возьми id нужного региона.","Запроси цены по региону: POST /api/b2b/v3/search/serp/region/ с region_id, checkin, checkout, guests (adults и возраст детей по каждому номеру), residency (гражданство гостей), currency и language. Фильтры — filter.star_rating, filter.meal_type, filter.price_from / filter.price_to, размер выдачи — hotels_limit.","Не давай пользователю выбирать тариф прямо из выдачи по региону: совпадение с тарифами страницы отеля не гарантируется.","Когда пользователь выбрал отель, запроси все его тарифы: POST /api/b2b/v3/search/hp/ с hid (числовой ID отеля), теми же датами, гостями и residency. Тариф живёт около 30 минут — по истечении повтори запрос.","Авторизация — HTTP Basic: KEY_ID как имя пользователя, API_KEY как пароль. Отлаживай на песочнице api-sandbox.ratehawk.com."],"code":"AUTH='<KEY_ID>:<API_KEY>'\nAPI=https://api.ratehawk.com/api/b2b/v3\n\ncurl --user \"$AUTH\" \"$API/search/multicomplete/\" -H 'Content-Type: application/json' \\\n  -d '{\"query\": \"Сочи\", \"language\": \"ru\"}'\n\ncurl --user \"$AUTH\" \"$API/search/serp/region/\" -H 'Content-Type: application/json' \\\n  -d '{\"checkin\": \"2026-11-20\", \"checkout\": \"2026-11-23\", \"residency\": \"ru\", \"language\": \"ru\",\n       \"guests\": [{\"adults\": 2, \"children\": []}], \"region_id\": <region_id>, \"currency\": \"RUB\",\n       \"hotels_limit\": 50, \"filter\": {\"star_rating\": [4, 5]}}'\n\ncurl --user \"$AUTH\" \"$API/search/hp/\" -H 'Content-Type: application/json' \\\n  -d '{\"hid\": <hid>, \"checkin\": \"2026-11-20\", \"checkout\": \"2026-11-23\", \"residency\": \"ru\",\n       \"language\": \"ru\", \"guests\": [{\"adults\": 2, \"children\": []}], \"currency\": \"RUB\"}'","language":"bash","methods":["POST /api/b2b/v3/search/multicomplete/","POST /api/b2b/v3/search/serp/region/","POST /api/b2b/v3/search/hp/"]},{"id":"zabronirovat-nomer","title":"Забронировать номер","summary":"Полный путь брони после выбора тарифа: проверка доступности, создание брони, запуск и ожидание подтверждения.","steps":["Проверь тариф перед бронью: POST /api/b2b/v3/hotel/prebook/ с hash — ID тарифа со страницы отеля — и price_increase_percent, если готов принять небольшой рост цены. Если тариф ушёл, API подберёт альтернативу с тем же типом номера и питанием и вернёт новый hash. Таймаут клиента — не меньше 30 секунд, лучше 60.","Сразу после prebook создай бронь: POST /api/b2b/v3/hotel/order/booking/form/ с partner_order_id (свой UUID, уникальный в рамках договора), book_hash из ответа prebook, language и user_ip конечного пользователя. Форма живёт 60 минут; в ответе — доступные способы оплаты.","Запусти бронирование: POST /api/b2b/v3/hotel/order/booking/finish/ с partner.partner_order_id, payment_type (type, amount, currency_code — из способов оплаты формы), rooms[].guests (first_name, last_name), user.email и user.phone менеджера.","Бронь асинхронная: опрашивай POST /api/b2b/v3/hotel/order/booking/finish/status/ с partner_order_id, пока статус не станет финальным (или подключи вебхук статуса). При оплате картой с 3D Secure в ответе придёт data_3ds.","Брони тестового отеля hid = 8473727 на test-ключе настоящие — после проверки их нужно отменить."],"code":"import time, uuid, requests\n\nAPI = \"https://api.ratehawk.com/api/b2b/v3\"\ns = requests.Session()\ns.auth = (\"<KEY_ID>\", \"<API_KEY>\")\ns.headers[\"User-Agent\"] = \"MyTravelApp/1.0\"\n\ndef call(path, body, timeout=60):\n    r = s.post(f\"{API}/{path}\", json=body, timeout=timeout)\n    r.raise_for_status()\n    return r.json()\n\npre = call(\"hotel/prebook/\", {\"hash\": rate_hash, \"price_increase_percent\": 5})\nbook_hash = pre[\"data\"][\"hotels\"][0][\"rates\"][0][\"book_hash\"]\n\norder_id = str(uuid.uuid4())\nform = call(\"hotel/order/booking/form/\", {\"partner_order_id\": order_id, \"book_hash\": book_hash,\n                                          \"language\": \"ru\", \"user_ip\": client_ip})\npay = form[\"data\"][\"payment_types\"][0]\n\ncall(\"hotel/order/booking/finish/\", {\n    \"language\": \"ru\",\n    \"partner\": {\"partner_order_id\": order_id},\n    \"payment_type\": {\"type\": pay[\"type\"], \"amount\": pay[\"amount\"], \"currency_code\": pay[\"currency_code\"]},\n    \"rooms\": [{\"guests\": [{\"first_name\": \"Ivan\", \"last_name\": \"Petrov\"}]}],\n    \"user\": {\"email\": \"manager@example.ru\", \"phone\": \"+79990001122\"},\n})\n\nwhile True:\n    st = call(\"hotel/order/booking/finish/status/\", {\"partner_order_id\": order_id})\n    if st[\"status\"] != \"processing\":\n        break\n    time.sleep(5)\nprint(st[\"status\"], st.get(\"data\"))","language":"python","methods":["POST /api/b2b/v3/hotel/prebook/","POST /api/b2b/v3/hotel/order/booking/form/","POST /api/b2b/v3/hotel/order/booking/finish/","POST /api/b2b/v3/hotel/order/booking/finish/status/"]},{"id":"otmenit-bronirovanie","title":"Отменить бронирование","summary":"Отмена по запросу гостя — с проверкой, во что она обойдётся.","steps":["Отменить можно только подтверждённую бронь: POST /api/b2b/v3/hotel/order/cancel/ с partner_order_id — тем же ID, что ты передавал при бронировании.","В ответе amount_payable — сумма штрафа и валюта. Для невозвратного тарифа штраф реальный, поэтому показывай условия отмены пользователю до вызова.","Апсейлы (ранний заезд, поздний выезд) автоматически не отменяются — учитывай их отдельно."],"code":"curl --user '<KEY_ID>:<API_KEY>' 'https://api.ratehawk.com/api/b2b/v3/hotel/order/cancel/' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"partner_order_id\": \"9b2f6c1e-5d4a-4f7e-8c3b-1a2d3e4f5a6b\"}'","language":"bash","methods":["POST /api/b2b/v3/hotel/order/cancel/"]},{"id":"zagruzit-opisanie-i-foto-otelya","title":"Загрузить описание и фото отеля","summary":"Карточка отеля для своей витрины: описание, адрес, удобства и фотографии.","steps":["Запроси контент: POST /api/b2b/v3/hotel/info/ с hid и language.","Лимит — не больше 30 запросов за 60 секунд, поэтому кэшируй карточки у себя, а не запрашивай их при каждом показе.","Передавай собственный User-Agent с названием своего приложения — без него запросы могут отклоняться.","Для полной базы отелей используй дампы статического контента, а hotel/info — для точечного обновления."],"code":"curl --user '<KEY_ID>:<API_KEY>' 'https://api.ratehawk.com/api/b2b/v3/hotel/info/' \\\n  -H 'Content-Type: application/json' -H 'User-Agent: MyTravelApp/1.0' \\\n  -d '{\"hid\": 8473727, \"language\": \"ru\"}'","language":"bash","methods":["POST /api/b2b/v3/hotel/info/"]}],"baseUrls":[{"label":"Боевой и тестовый","url":"https://api.ratehawk.com"},{"label":"Песочница","url":"https://api-sandbox.ratehawk.com"},{"label":"Старые хосты  и  устарели.","url":"api.worldota.net"}],"auth":{"type":"basic","description":"HTTP Basic Authentication ключом API вида `<KEY_ID>:<API_KEY>`: `KEY_ID` — имя пользователя, `API_KEY` — пароль. Ключи бывают трёх типов: sandbox, test (только тестовый отель `hid = 8473727`, брони реальные) и production. Ключи видны в разделе API настроек договора (доступ — у Master-аккаунта).","example":"curl --user '<KEY_ID>:<KEY>' --data '{\"id\":\"city_hotel_berlin_east\",\"language\":\"en\"}' \"https://api.ratehawk.com/api/b2b/v3/hotel/info/\""},"methods":[{"id":"POST /api/b2b/v3/search/multicomplete/","title":"Подсказки отелей и регионов","httpMethod":"POST","path":"/api/b2b/v3/search/multicomplete/","description":"Автодополнение по части названия; до 5 результатов в каждой категории.","params":[{"name":"query","in":"body","type":"string","required":true,"description":"Часть названия отеля или региона"},{"name":"language","in":"body","type":"string","required":false,"description":"Язык, например ru, en"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/search/serp/region/","title":"Поиск цен по региону","httpMethod":"POST","path":"/api/b2b/v3/search/serp/region/","description":"Не рекомендуется давать пользователю выбирать тарифы из этого ответа: точного совпадения с `search/hp` не гарантируется.\n\nТакже есть поиск по ID отелей (`/api/b2b/v3/search/serp/hotels/`) и по координатам.","params":[{"name":"checkin","in":"body","type":"string","required":true,"description":"Дата заезда, не позже 730 дней от текущей"},{"name":"checkout","in":"body","type":"string","required":true,"description":"Дата выезда, не позже 30 дней от заезда"},{"name":"region_id","in":"body","type":"integer","required":true,"description":"ID региона"},{"name":"residency","in":"body","type":"string","required":false,"description":"Гражданство гостей, ISO 3166-1 alpha-2"},{"name":"guests","in":"body","type":"array","required":false,"description":"Гости по номерам"},{"name":"guests[].adults","in":"body","type":"integer","required":true,"description":"Число взрослых в номере"},{"name":"guests[].children","in":"body","type":"array","required":false,"description":"Возраст детей"},{"name":"currency","in":"body","type":"string","required":false,"description":"Валюта цен"},{"name":"language","in":"body","type":"string","required":false,"description":"Язык данных отеля"},{"name":"hotels_limit","in":"body","type":"integer","required":false,"description":"Максимум отелей в ответе"},{"name":"timeout","in":"body","type":"number","required":false,"description":"Максимальное время поиска, секунд"},{"name":"filter.star_rating","in":"body","type":"array","required":false,"description":"Звёздность 1–5"},{"name":"filter.kind","in":"body","type":"array","required":false,"description":"Тип отеля"},{"name":"filter.meal_type","in":"body","type":"string","required":false,"description":"Тип питания, например all-inclusive"},{"name":"filter.price_from","in":"body","type":"integer","required":false,"description":"Минимальная цена"},{"name":"filter.price_to","in":"body","type":"integer","required":false,"description":"Максимальная цена"}],"requestExample":"curl --user '<KEY_ID>:<API_KEY>' 'https://api.ratehawk.com/api/b2b/v3/search/serp/region/' \\\n--header 'Content-Type: application/json' \\\n--data '{\n \"checkin\": \"2026-10-22\",\n \"checkout\": \"2026-10-25\",\n \"residency\": \"gb\",\n \"language\": \"en\",\n \"guests\": [\n {\n \"adults\": 2,\n \"children\": []\n }\n ],\n \"region_id\": 6053839,\n \"currency\": \"EUR\",\n \"filter\": {\n \"star_rating\": [],\n \"kind\": [],\n \"meal_type\": [\n \"all-inclusive\"\n ]\n }\n}'","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/search/hp/","title":"Страница отеля (все тарифы)","httpMethod":"POST","path":"/api/b2b/v3/search/hp/","description":"Вызывается, когда пользователь выбрал отель; рекомендуемое время жизни тарифа — 30 минут.","params":[{"name":"hid","in":"body","type":"integer","required":true,"description":"ID отеля (числовой); старое поле id устарело"},{"name":"checkin","in":"body","type":"string","required":true,"description":"Дата заезда"},{"name":"checkout","in":"body","type":"string","required":true,"description":"Дата выезда"},{"name":"residency","in":"body","type":"string","required":false,"description":"Гражданство гостей"},{"name":"guests[].adults","in":"body","type":"integer","required":true,"description":"Число взрослых в номере"},{"name":"guests[].children","in":"body","type":"array","required":false,"description":"Возраст детей"},{"name":"currency","in":"body","type":"string","required":false,"description":"Валюта"},{"name":"language","in":"body","type":"string","required":false,"description":"Язык"},{"name":"timeout","in":"body","type":"number","required":false,"description":"Время поиска, секунд"},{"name":"filter","in":"body","type":"object","required":false,"description":"Фильтры: star_rating, kind, meal_type, price_from, price_to"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/hotel/prebook/","title":"Предбронирование тарифа","httpMethod":"POST","path":"/api/b2b/v3/hotel/prebook/","description":"Проверяет доступность тарифа перед бронированием; при недоступности ищет альтернативу того же типа номера и питания и возвращает новые `book_hash`/`match_hash`. Рекомендуемый таймаут — 60 секунд, минимальный — 30.","params":[{"name":"hash","in":"body","type":"string","required":true,"description":"ID тарифа"},{"name":"price_increase_percent","in":"body","type":"integer","required":false,"description":"На сколько процентов допускается рост цены"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/hotel/order/booking/form/","title":"Создание процесса бронирования","httpMethod":"POST","path":"/api/b2b/v3/hotel/order/booking/form/","description":"Вызывается сразу после prebook; форма живёт 60 минут.","params":[{"name":"partner_order_id","in":"body","type":"string","required":true,"description":"Внешний ID брони (UUID)"},{"name":"book_hash","in":"body","type":"string","required":true,"description":"ID выбранного тарифа"},{"name":"language","in":"body","type":"string","required":true,"description":"Язык"},{"name":"user_ip","in":"body","type":"string","required":true,"description":"IP конечного пользователя"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/hotel/order/booking/finish/","title":"Запуск бронирования","httpMethod":"POST","path":"/api/b2b/v3/hotel/order/booking/finish/","description":"Бронирование асинхронное — дальше опрашивайте статус. Невалидные данные пользователя могут попасть в стоп-лист.","params":[{"name":"language","in":"body","type":"string","required":true,"description":"Язык"},{"name":"partner.partner_order_id","in":"body","type":"string","required":true,"description":"Внешний ID брони"},{"name":"partner.comment","in":"body","type":"string","required":false,"description":"Внутренний комментарий партнёра"},{"name":"partner.amount_sell_b2b2c","in":"body","type":"string","required":false,"description":"Цена перепродажи в валюте договора"},{"name":"payment_type.type","in":"body","type":"string","required":true,"description":"Тип оплаты (например, hotel, deposit)"},{"name":"payment_type.amount","in":"body","type":"string","required":true,"description":"Сумма"},{"name":"payment_type.currency_code","in":"body","type":"string","required":true,"description":"Валюта, ISO 4217"},{"name":"rooms","in":"body","type":"array","required":true,"description":"Номера"},{"name":"rooms[].guests","in":"body","type":"array","required":true,"description":"Гости: first_name, last_name, is_child, age"},{"name":"user.email","in":"body","type":"string","required":true,"description":"Email менеджера партнёра"},{"name":"user.phone","in":"body","type":"string","required":true,"description":"Телефон менеджера партнёра"},{"name":"user.comment","in":"body","type":"string","required":false,"description":"Комментарий для отеля"},{"name":"supplier_data","in":"body","type":"object","required":false,"description":"Контакты инициатора брони: first_name_original, last_name_original, email, phone"},{"name":"arrival_datetime","in":"body","type":"string","required":false,"description":"Ожидаемое время прибытия"},{"name":"return_path","in":"body","type":"string","required":false,"description":"URL возврата после 3D Secure"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/hotel/order/booking/finish/status/","title":"Проверка статуса бронирования","httpMethod":"POST","path":"/api/b2b/v3/hotel/order/booking/finish/status/","description":"Обязателен, если не используется вебхук статуса бронирования; при 3D Secure в ответе приходит `data_3ds`.","params":[{"name":"partner_order_id","in":"body","type":"string","required":true,"description":"ID брони партнёра, 1–256 символов"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/hotel/order/cancel/","title":"Отмена бронирования","httpMethod":"POST","path":"/api/b2b/v3/hotel/order/cancel/","description":"Отменяются только успешно подтверждённые брони; при отмене невозвратного тарифа штраф реальный. Апсейлы автоматически не отменяются.\n\nВ ответе — `amount_payable` (сумма штрафа и валюта).","params":[{"name":"partner_order_id","in":"body","type":"string","required":true,"description":"ID брони партнёра"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /api/b2b/v3/hotel/info/","title":"Контент отеля","httpMethod":"POST","path":"/api/b2b/v3/hotel/info/","description":"Не больше 30 запросов за 60 секунд; передавайте собственный `User-Agent`, например `RatehawkPartner/1.0 (python-requests/2.18.4)`.","params":[{"name":"hid","in":"body","type":"integer","required":false,"description":"Числовой ID отеля (нужен он или устаревший id)"},{"name":"id","in":"body","type":"string","required":false,"description":"Устаревший строковый ID отеля"},{"name":"language","in":"body","type":"string","required":false,"description":"Язык"}],"requestExample":"","responseExample":"","docsUrl":""}],"codeExamples":[],"errors":[{"code":"invalid_params","description":"400 — не переданы обязательные данные (см. debug.validation_error)"},{"code":"decoding_json","description":"Тело запроса не разобрано как JSON"},{"code":"not_allowed_host","description":"Запросы с вашего хоста или IP запрещены"},{"code":"unexpected_method","description":"Неподдерживаемый HTTP-метод (используйте GET или POST)"}],"limits":"Лимит задаётся на каждый эндпоинт и возвращается в заголовках: `X-RateLimit-SecondsNumber` (период, сек), `X-RateLimit-RequestsNumber` (максимум запросов за период), `X-RateLimit-Remaining` (остаток), `X-RateLimit-Reset` (окончание периода, UTC). Пример: 10 запросов в секунду.","gotchas":["GET — для получения данных (параметры в `data` строки запроса), POST — для создания, изменения и удаления; тело — JSON-объект.","Рекомендуемый поток: поиск → `search/hp` → `hotel/prebook` → `booking/form` → `booking/finish` → `booking/finish/status` (или вебхук).","`partner_order_id` уникален в рамках договора и используется во всех вызовах после создания брони.","Брони тестового отеля `hid = 8473727` реальные — их нужно отменять.","В песочнице язык всегда `en`, валюта обычно USD/EUR, число тарифов ограничено 5, 3D Secure не поддерживается.","Лимиты и доступные эндпоинты ключа — метод Retrieve endpoints; лимиты повышают только после сертификации."],"slug":"ostrovok-etg","version":2,"updatedAt":"2026-10-24T17:05:34.512Z","sources":[{"title":"ETG API V3 — Overview","url":"https://docs.emergingtravel.com/docs/overview/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Authorization","url":"https://docs.emergingtravel.com/docs/fundamentals/authorization/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Request limits","url":"https://docs.emergingtravel.com/docs/fundamentals/request-limits/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Requests","url":"https://docs.emergingtravel.com/docs/fundamentals/requests/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Errors","url":"https://docs.emergingtravel.com/docs/fundamentals/errors/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Sandbox","url":"https://docs.emergingtravel.com/docs/fundamentals/sandbox/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Search by region","url":"https://docs.emergingtravel.com/docs/b2b-api/hotel-search/search-by-region/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Retrieve hotelpage","url":"https://docs.emergingtravel.com/docs/b2b-api/hotel-search/retrieve-hotelpage/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Prebook","url":"https://docs.emergingtravel.com/docs/b2b-api/hotel-search/prebook-rate-from-hotelpage-step/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Create booking process","url":"https://docs.emergingtravel.com/docs/b2b-api/booking/create-booking-process/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Start booking process","url":"https://docs.emergingtravel.com/docs/b2b-api/booking/start-booking-process/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Check booking process","url":"https://docs.emergingtravel.com/docs/b2b-api/booking/check-booking-process/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Cancel booking","url":"https://docs.emergingtravel.com/docs/b2b-api/post-booking/cancel-booking/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Retrieve hotel content","url":"https://docs.emergingtravel.com/docs/b2b-api/static-content/retrieve-hotel-content/","kind":"research","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"Вставленный текст","url":"","kind":"import","addedAt":"2026-10-17T07:10:45.493Z"},{"title":"scenarios-ostrovok-etg.md","url":"","kind":"import","addedAt":"2026-10-24T17:05:25.617Z"}],"logoUrl":null}