API виджета бронирования Shelter Cloud v3
Версия: v3 | Статус: Future (в разработке) | Лицензия: Бронирование онлайн | Продукт: Shelter Cloud | Уровень: Дилерский
Оглавление
- Общее описание
- Аутентификация
- Ограничение частоты запросов
- Типовой сценарий бронирования
- Формат ответа
- Методы API
- getHotelData — Данные отеля
- getVariants — Поиск вариантов размещения
- getExtraServices — Дополнительные услуги
- getPaymentOptions — Способы оплаты
- putOrder — Создание бронирования
- getOrder — Получение данных заказа
- annulOrder — Отмена бронирования
- getAvailableDates — Доступные даты
- checkPromoCode — Проверка промокода
- login — Авторизация пользователя
- setRequest — Заявка на бронирование
- Устранение неполадок
Общее описание
API v3 предназначено для создания собственного модуля онлайн-бронирования на сайте отеля или сторонней платформе (версия v3).
Возможности API:
- Получение данных отеля: настройки, справочники категорий номеров, тарифов, опций
- Поиск вариантов размещения по заданным параметрам (даты, количество номеров, состав гостей) с ценами
- Получение списка дополнительных услуг
- Получение доступных способов оплаты
- Создание и отмена бронирования
- Получение данных заказа для страницы подтверждения
- Проверка промокодов
- Авторизация пользователя (постоянного гостя)
- Проверка доступных дат для заезда
- Отправка заявки на бронирование (без немедленного создания брони)
Базовый URL: https://cloud.shelter.ru/OnlineWidget3/online/v3/
Резервный URL: https://pms.frontdesk24.ru/OnlineWidget3/online/v3/
Протокол: HTTPS, все методы — POST, формат данных — JSON.
Требование: Для работы API необходима активная лицензия на модуль «Бронирование онлайн». Без этого модуля API не будет функционировать.
Content-Type: application/json; charset=utf-8
Swagger-документация:
- Продуктивная среда: https://cloud.shelter.ru/OnlineWidget3/swagger/index.html
- Тестовая среда: https://test.shelter.ru/OnlineWidget3/swagger/index.html
Методы: getHotelData, getVariants, getExtraServices, getPaymentOptions, putOrder, getOrder, annulOrder, getAvailableDates, checkPromoCode, login, setRequest
Аутентификация
API использует двухуровневую систему токенов:
- Токен отеля (
token) — обязателен для всех методов. Идентифицирует отель. Формат UUID. - Токен пользователя (
userToken) — необязателен. Возвращается методомloginпосле авторизации. Передаётся в последующих запросах для персонализации.
Получение токена отеля
- Войти в личный кабинет Shelter Cloud
- Нажать на имя пользователя в правом верхнем углу
- Перейти на вкладку «Онлайн v2»
- Нажать «Добавить виджет»
- Скопировать токен из блока «Код вставки»



Ограничение частоты запросов
Ограничений на количество запросов в API виджета бронирования v3 нет.
Rate limiting к этому API не применяется:
| Ограничение | Значение |
|---|---|
| Лимит запросов в секунду | нет |
| Лимит запросов в минуту | нет |
| Лимит запросов в час | нет |
| Суточная квота | нет |
| Лимит на токен отеля | нет |
Код ответа 429 Too Many Requests API виджета бронирования не возвращает. Дополнительно оформлять квоту, повышать лимит или заказывать расширение не нужно — ограничивать нечего.
Сколько запросов можно отправлять? Столько, сколько нужно виджету. Частота вызовов getHotelData, getVariants, getExtraServices, getPaymentOptions, putOrder, getOrder, annulOrder, getAvailableDates, checkPromoCode, login и setRequest не ограничена.
Не путать с ShelterCloudAPI. Ограничение частоты запросов — 60 в минуту и 3600 в час на токен, с ответом
429при превышении — действует в ShelterCloudAPI (/ShelterCloudApi/). Это другое API, для интеграций с CRM и внешними системами. На API виджета бронирования его лимиты не распространяются.
Рекомендация, а не ограничение: справочные данные из getHotelData меняются редко, их имеет смысл запрашивать один раз при инициализации виджета и кэшировать, а getVariants вызывать по факту поиска, а не на каждое нажатие клавиши. Это вопрос скорости работы виджета — блокировки за частые запросы не будет.
Типовой сценарий бронирования
1. Инициализация
└── getHotelData → параметры, валюты, языки, сервисы, тарифы, категории
2. Календарь (опционально)
└── getAvailableDates → даты с минимальными ценами
3. Поиск
└── getVariants → категории, тарифы, фото, варианты с ценами
4. Дополнительные услуги
└── getExtraServices → доп. услуги, питание
5. Выбор оплаты
└── getPaymentOptions → доступные способы оплаты
6. Бронирование
└── putOrder → создание заказа, ссылка на оплату
7. Управление
├── getOrder → детали заказа (страница подтверждения)
└── annulOrder → отмена заказа
Формат ответа
Все методы возвращают ответ в едином формате:
{
"success": true,
"data": { },
"error": {
"code": "string",
"message": "string"
},
"notify": {
"type": "string",
"message": "string"
}
}
| Поле | Тип | Описание |
|---|---|---|
success |
bool | Признак успешного выполнения |
data |
object/array | Данные ответа (структура зависит от метода) |
error |
object? | Информация об ошибке (null при успехе) |
error.code |
string | Код ошибки |
error.message |
string | Описание ошибки |
notify |
object? | Уведомление для пользователя (null если нет) |
Методы API
getHotelData — Данные отеля
URL: POST /OnlineWidget3/online/v3/getHotelData
Назначение: Возвращает параметры отеля, доступные валюты, языки, сервисы, тарифы и категории номеров. Вызывается один раз при инициализации виджета.
Запрос
{
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A",
"language": "ru",
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
language |
string | Нет | Язык (ru, en и т.д.) |
userToken |
string | Нет | Токен авторизованного пользователя |
Ответ
{
"success": true,
"data": {
"params": {
"minDateFrom": "2024-08-16T00:00:00",
"maxDateTo": "2024-08-17T00:00:00",
"defaultDateFrom": "2024-08-16T00:00:00",
"defaultDateTo": "2024-08-17T00:00:00",
"allowBeds": true,
"onlyBedPlaces": false,
"defaultNumberOfGuests": null,
"minAgeOfChild": null,
"maxAgeOfChild": null,
"maxRoomCapacity": null,
"allowUpsale": true,
"disableAuth": false,
"askOnlyFirstGuest": false,
"defaultPhoneCode": "7"
},
"currencies": [
{ "code": "RUB", "name": "Рубль", "id": "" }
],
"languages": [
{ "code": "ru", "name": "Русский", "id": "" }
],
"hotels": [
{ "token": "Токен отеля", "name": "Название отеля", "id": "id отеля" }
],
"analytics": {
"google": { "analyticsCounter": null, "analyticsGoalCalendar": null, "..." : "..." },
"yandex": { "metrikaCounter": null, "metrikaGoalCalendar": null, "..." : "..." }
},
"services": [
{
"id": "",
"name": "Номера",
"filters": [
{ "type": "days", "name": "По дням", "id": "" },
{ "type": "hours", "name": "По часам", "id": "" }
]
}
],
"tariffs": [
{ "id": 24809, "name": "Стандарт", "isPromotionGroup": false }
],
"tariffOptions": [],
"roomTypes": [
{ "id": 39453, "name": "Полулюкс" }
],
"roomCategoryOptions": [
{ "id": 1, "name": "Кондиционер", "url": "Content/Gallery/RoomOptions/cond.svg" }
]
}
}
Описание полей ответа
params — Параметры виджета:
| Поле | Тип | Описание |
|---|---|---|
minDateFrom |
DateTime | Минимальная дата заезда (на которую есть цены) |
maxDateTo |
DateTime | Максимальная дата выезда (на которую есть цены) |
defaultDateFrom |
DateTime | Дата заезда по умолчанию |
defaultDateTo |
DateTime | Дата выезда по умолчанию |
allowBeds |
bool | Разрешено бронирование по койко-местам |
onlyBedPlaces |
bool | Только бронирование по койко-местам |
defaultNumberOfGuests |
int? | Число гостей по умолчанию |
minAgeOfChild |
int? | Минимальный возраст ребёнка |
maxAgeOfChild |
int? | Максимальный возраст ребёнка |
maxRoomCapacity |
int? | Максимальная вместимость номера |
allowUpsale |
bool | Разрешена продажа доп. услуг |
disableAuth |
bool | Авторизация отключена |
askOnlyFirstGuest |
bool | Запрашивать данные только первого гостя |
defaultPhoneCode |
string | Код страны для телефона по умолчанию |
currencies — массив доступных валют (code, name, id)
languages — массив доступных языков (code, name, id)
hotels — массив отелей, подключённых к виджету (token, name, id)
analytics — настройки Google Analytics и Яндекс.Метрики
services — типы сервисов (Номера, Конференц-зал, SPA и т.д.) с фильтрами бронирования (days, hours)
tariffs — массив тарифов (id, name, isPromotionGroup)
roomTypes — массив категорий номеров (id, name)
roomCategoryOptions — массив опций категорий (id, name, url)
getVariants — Поиск вариантов размещения
URL: POST /OnlineWidget3/online/v3/getVariants
Назначение: Основной метод поиска. Возвращает доступные варианты размещения с ценами.
Запрос
{
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A",
"language": "ru",
"currency": "RUB",
"dateFrom": "2024-09-02",
"dateTo": "2024-09-12",
"rooms": [
{ "adults": 2, "kids": 2, "kidsAges": [5, 3] }
],
"serviceId": "3",
"bookingType": "days",
"roomsOnly": false,
"promocode": null,
"tariffId": null,
"isPromotionGroup": null,
"tariffOptionsIDs": [],
"roomCategoryOptionsIDs": [],
"checkInTime": null,
"hours": null,
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
currency |
string | Да | Валюта |
dateFrom |
string | Да | Дата заезда (yyyy-MM-dd) |
dateTo |
string | Да | Дата выезда (yyyy-MM-dd) |
rooms |
array | Да | Список номеров с составом гостей |
rooms[].adults |
int | Да | Число взрослых |
rooms[].kids |
int | Нет | Число детей |
rooms[].kidsAges |
int[] | Нет | Возраста детей |
serviceId |
string | Да | ID сервиса (из getHotelData) |
bookingType |
string | Да | Тип бронирования: days или hours |
roomsOnly |
bool | Нет | Только номера |
promocode |
string | Нет | Промокод |
tariffId |
int | Нет | Фильтр по ID тарифа |
isPromotionGroup |
bool | Нет | Фильтр по акциям |
tariffOptionsIDs |
int[] | Нет | Фильтр по опциям тарифов |
roomCategoryOptionsIDs |
int[] | Нет | Фильтр по опциям категорий |
checkInTime |
string | Нет | Время заезда (для почасового) |
hours |
string | Нет | Кол-во часов (для почасового) |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
Ответ
{
"success": true,
"data": {
"roomTypes": [
{
"id": 39329,
"name": "Люкс (дабл)",
"description": null,
"availableRooms": 12,
"availableBeds": 48,
"roomArea": 32,
"mainBeds": 4,
"extraBeds": 2,
"withoutBeds": false,
"allowConnectBeds": false
}
],
"roomCategoryOptions": [
{ "roomCategoryId": 39332, "roomCategoryOptionId": 1 }
],
"tariffs": [
{ "id": 24809, "name": "Стандарт", "isPromotion": false, "description": null, "image": null }
],
"tariffOptions": [
{ "tariffID": 39332, "isPromotion": false, "tariffOptionID": 1 }
],
"upsaleOptions": [],
"variants": [
{
"roomCategoryId": 39332,
"tariffId": 24854,
"tariffOrder": null,
"promotionId": 24854,
"accmdId": 65721,
"accmdName": "Основное",
"currency": "RUB",
"price": 3000,
"bedPlace": true,
"agesOfChildrenWithBeds": [7, 5, 3],
"agesOfChildrenWithoutBeds": [7, 5, 3],
"totalDiscountPercent": 0,
"promocodeDiscountPercent": 0,
"promotionDiscountPercent": 0,
"priceWithoutDiscount": 3000,
"prepayment": 0
}
],
"roomTypeImages": [
{
"roomCategoryId": 39453,
"url": "Content/Gallery/RoomTypes/no-image-grey.jpg",
"urlLarge": "Content/Gallery/RoomTypes/no-image-grey.jpg",
"isVideo": false
}
]
}
}
Описание полей ответа
roomTypes — категории номеров:
| Поле | Тип | Описание |
|---|---|---|
id |
int | ID категории |
name |
string | Название |
description |
string? | Описание |
availableRooms |
int | Доступных номеров |
availableBeds |
int | Доступных кроватей |
roomArea |
int? | Площадь номера |
mainBeds |
int | Основных мест |
extraBeds |
int | Дополнительных мест |
withoutBeds |
bool | Без кровати |
allowConnectBeds |
bool | Кровати сдвигаются |
variants — варианты бронирования:
| Поле | Тип | Описание |
|---|---|---|
roomCategoryId |
int | ID категории |
tariffId |
int | ID тарифа |
tariffOrder |
int? | Порядок сортировки тарифа |
promotionId |
int? | ID акции |
accmdId |
int | ID типа размещения |
accmdName |
string | Название размещения |
currency |
string | Валюта |
price |
decimal | Цена |
bedPlace |
bool | Является ли койко-местом |
agesOfChildrenWithBeds |
int[] | Возраста детей с местом |
agesOfChildrenWithoutBeds |
int[] | Возраста детей без места |
totalDiscountPercent |
decimal | Общий % скидки |
promocodeDiscountPercent |
decimal | % скидки по промокоду |
promotionDiscountPercent |
decimal | % скидки по акции |
priceWithoutDiscount |
decimal | Цена без скидки |
prepayment |
decimal | Размер предоплаты |
roomTypeImages — изображения категорий (roomCategoryId, url, urlLarge, isVideo)
getExtraServices — Дополнительные услуги
URL: POST /OnlineWidget3/online/v3/getExtraServices
Назначение: Возвращает дополнительные услуги, питание и опции для выбранного варианта.
Запрос
{
"token": "EAAB810C-EE10-4ED9-BA1E-BC5112BB6AB9",
"language": "ru",
"currency": "RUB",
"roomCategoryIDs": [39332],
"dateFrom": "2024-09-18",
"dateTo": "2024-09-19",
"amountOfAdults": 1,
"amountOfChildren": 0,
"ageOfChildren": [],
"numberOfRooms": 1,
"tariffsIDs": [24854],
"promotionsIDs": [],
"bedPlace": "0",
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
currency |
string | Да | Валюта |
roomCategoryIDs |
int[] | Да | ID категорий номеров |
dateFrom |
string | Да | Дата заезда |
dateTo |
string | Да | Дата выезда |
amountOfAdults |
int | Да | Число взрослых |
amountOfChildren |
int | Да | Число детей |
ageOfChildren |
int[] | Нет | Возраста детей |
numberOfRooms |
int | Да | Число номеров |
tariffsIDs |
int[] | Да | ID тарифов |
promotionsIDs |
int[] | Нет | ID акций |
bedPlace |
string | Да | "0" = номер, "1" = койко-место |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
Ответ
{
"success": true,
"data": {
"roomTypes": [],
"roomCategoryOptions": [],
"meals": [],
"extraServiceGroups": [],
"extraServices": []
}
}
| Поле | Тип | Описание |
|---|---|---|
roomTypes |
array | Категории номеров |
roomCategoryOptions |
array | Опции категорий |
meals |
array | Варианты питания |
extraServiceGroups |
array | Группы доп. услуг |
extraServices |
array | Доп. услуги |
getPaymentOptions — Способы оплаты
URL: POST /OnlineWidget3/online/v3/getPaymentOptions
Назначение: Возвращает доступные способы оплаты.
Запрос
{
"token": "EAAB810C-EE10-4ED9-BA1E-BC5112BB6AB9",
"language": "ru",
"currency": "RUB",
"roomCategoryIDs": [39332],
"dateFrom": "2024-09-18",
"dateTo": "2024-09-19",
"amountOfAdults": 1,
"amountOfChildren": 0,
"ageOfChildren": [],
"numberOfRooms": 1,
"tariffsIDs": [24854],
"promotionsIDs": [],
"bedPlace": "0",
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
currency |
string | Да | Валюта |
roomCategoryIDs |
int[] | Да | ID категорий номеров |
dateFrom |
string | Да | Дата заезда |
dateTo |
string | Да | Дата выезда |
amountOfAdults |
int | Да | Число взрослых |
amountOfChildren |
int | Да | Число детей |
ageOfChildren |
int[] | Нет | Возраста детей |
numberOfRooms |
int | Да | Число номеров |
tariffsIDs |
int[] | Да | ID тарифов |
promotionsIDs |
int[] | Нет | ID акций |
bedPlace |
string | Да | "0" = номер, "1" = койко-место |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
Ответ
{
"success": true,
"data": {
"agreeText": "Пользовательское соглашение",
"agreeUrl": "https://example.com/agreement",
"openPaymentInNewTab": true,
"paymentOptions": [
{
"id": 1,
"name": "Оплата картой",
"description": "Оплата картой Visa, MasterCard или МИР",
"image": "Content/Gallery/PaymentTypes/card.svg",
"paymentKind": 24
},
{
"id": 4,
"name": "Перевод на расчётный счёт",
"description": "Получить счёт на оплату через клиент-банк или по QR-коду",
"image": "Content/Gallery/PaymentTypes/beznal.svg",
"paymentKind": null
},
{
"id": 2,
"name": "Оплата в отеле",
"description": "Оплата при заезде наличными или картой",
"image": "Content/Gallery/PaymentTypes/hotel-payment.svg",
"paymentKind": null
}
]
}
}
| Поле | Тип | Описание |
|---|---|---|
agreeText |
string? | Текст ссылки на соглашение |
agreeUrl |
string? | URL соглашения |
openPaymentInNewTab |
bool | Открывать оплату в новом окне |
paymentOptions |
array | Массив способов оплаты |
paymentOptions[].id |
int | ID способа оплаты |
paymentOptions[].name |
string | Название |
paymentOptions[].description |
string | Описание |
paymentOptions[].image |
string | URL иконки |
paymentOptions[].paymentKind |
int? | Тип платёжной системы |
putOrder — Создание бронирования
URL: POST /OnlineWidget3/online/v3/putOrder
Назначение: Создаёт новое бронирование. Возвращает токен заказа и ссылку на оплату.
Запрос
{
"token": "EAAB810C-EE10-4ED9-BA1E-BC5112BB6AB9",
"language": "ru",
"source": "hotel-website.ru",
"paymentMethodID": 2,
"comment": "Комментарий к заказу",
"customer": {
"email": "guest@example.com",
"phone": "+79000000000",
"surname": "Иванов",
"name": "Иван",
"secondName": "Иванович"
},
"reservations": [
{
"dateFrom": "2024-09-18",
"dateTo": "2024-09-19",
"roomCategoryId": 39469,
"tariffId": 24853,
"isPromotion": 0,
"promocode": null,
"guestsCount": 1,
"bedPlace": 0,
"currency": "RUB",
"price": 2000,
"totalDiscountPercent": 0,
"promocodeDiscountPercent": 0,
"promotionDiscountPercent": 0,
"priceWithoutDiscount": 2000,
"priceRub": 2000,
"prepaymentRub": 0,
"prepaymentCurrency": 0,
"guests": [
{
"surname": "Иванов",
"name": "Иван",
"secondName": "Иванович",
"email": "guest@example.com",
"phone": "+79000000000",
"withoutBed": false
}
]
}
],
"extraServices": [
{ "id": 18188, "count": 1, "price": 1500, "priceRub": 1500, "prepaymentRub": 0, "prepaymentCurrency": 0 }
],
"mealId": 87963,
"mealPriceRub": 500,
"mealPrepaymentRub": 0,
"mealPrepaymentCurrency": 0,
"userToken": ""
}
Описание полей запроса
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
source |
string | Да | Источник заказа |
paymentMethodID |
int | Да | ID способа оплаты (из getPaymentOptions) |
comment |
string | Нет | Комментарий к заказу |
customer |
object | Да | Данные заказчика |
reservations |
array | Да | Массив бронирований |
extraServices |
array | Нет | Массив доп. услуг |
mealId |
int | Нет | ID питания |
mealPriceRub |
decimal | Нет | Стоимость питания |
mealPrepaymentRub |
decimal | Нет | Предоплата за питание |
mealPrepaymentCurrency |
decimal | Нет | Предоплата за питание (валюта) |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
customer:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
email |
string | Да | |
phone |
string | Да | Телефон |
surname |
string | Да | Фамилия |
name |
string | Да | Имя |
secondName |
string | Нет | Отчество |
reservations[]:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
dateFrom |
string | Да | Дата заезда |
dateTo |
string | Да | Дата выезда |
roomCategoryId |
int | Да | ID категории номера |
tariffId |
int | Да | ID тарифа |
isPromotion |
int | Да | 0 = тариф, 1 = акция |
promocode |
string? | Нет | Промокод |
guestsCount |
int | Да | Число гостей |
bedPlace |
int | Да | 0 = номер, 1 = койко-место |
currency |
string | Да | Валюта |
price |
decimal | Да | Цена |
totalDiscountPercent |
decimal | Да | Итоговый % скидки |
promocodeDiscountPercent |
decimal | Да | % скидки по промокоду |
promotionDiscountPercent |
decimal | Да | % скидки по акции |
priceWithoutDiscount |
decimal | Да | Цена без скидки |
priceRub |
decimal | Да | Цена в рублях |
prepaymentRub |
decimal | Да | Предоплата в рублях |
prepaymentCurrency |
decimal | Да | Предоплата в валюте |
guests |
array | Да | Список гостей |
guests[]:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
surname |
string | Да | Фамилия |
name |
string | Да | Имя |
secondName |
string | Нет | Отчество |
email |
string | Нет | |
phone |
string | Нет | Телефон |
age |
int | Нет | Возраст (для детей) |
withoutBed |
bool | Нет | Гость без места |
extraServices[]:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
id |
int | Да | ID услуги |
count |
int | Да | Количество |
price |
decimal | Да | Цена |
priceRub |
decimal | Да | Цена в рублях |
prepaymentRub |
decimal | Да | Предоплата |
prepaymentCurrency |
decimal | Да | Предоплата (валюта) |
Ответ
{
"success": true,
"data": {
"paymentLink": null,
"orderToken": "93744f45-e4f7-4271-8fb0-1d907e463b1d",
"errorCreationPaymentLink": null,
"bookingCode": 5138,
"paymentSystemId": 0
}
}
| Поле | Тип | Описание |
|---|---|---|
paymentLink |
string? | Ссылка на оплату (null если не требуется) |
orderToken |
string | Токен заказа (UUID) |
errorCreationPaymentLink |
string? | Ошибка создания ссылки на оплату |
bookingCode |
int | Код бронирования |
paymentSystemId |
int | ID платёжной системы |
Как заполняется paymentSystemId и paymentLink:
- Поля заполняются только при онлайн-оплате — когда
paymentMethodIDсоответствует способу оплаты с переходом на платёжный шлюз (банковская карта, СБП, QR и т.п., изgetPaymentOptions). paymentSystemId— это внутренний ID платёжной системы, настроенной для отеля (совпадает со значениями из инструкций по платёжным системам: 2 — Hotel cash, 11 — Uniteller, 18 — Сбербанк, 20 — МИР и т.д.).- Если выбрана оплата в отеле (
paymentMethodID = 2) или другой способ без онлайн-платежа, ссылка на оплату не создаётся: в ответе придутpaymentLink: null,paymentSystemId: 0,errorCreationPaymentLink: null— это нормальное поведение, а не ошибка. - Если онлайн-оплата запрошена, но платёжная система для отеля не настроена или не удалось создать ссылку,
paymentLinkбудетnull, а причина — вerrorCreationPaymentLink.
getOrder — Получение данных заказа
URL: POST /OnlineWidget3/online/v3/getOrder
Назначение: Получает данные созданного заказа для страницы подтверждения.
Запрос
{
"orderToken": "93744f45-e4f7-4271-8fb0-1d907e463b1d",
"language": "ru",
"currency": "RUB",
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
orderToken |
string | Да | Токен заказа (из putOrder) |
currency |
string | Да | Валюта |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
Ответ
{
"success": true,
"data": {
"orderInfo": {
"hotelId": 5655,
"hotelName": "Родник Алтая",
"hotelAddress": "659900, Алтайский, Белокуриха",
"hotelEmail": "hotel@example.com",
"hotelPhones": "88005500880",
"hotelImage": "Content/Images/5655_Hotels_x450.jpg",
"bookingCode": 5138,
"createDate": "2024-09-03T09:35:50.35",
"customerName": "Иванов Иван Иванович",
"customerPhone": "+79000000000",
"customerEmail": "guest@example.com",
"comment": "Комментарий",
"paymentMethodName": "Оплата в отеле",
"accommodationPrice": 2000.0,
"toPay": 4800.0,
"prepayment": 4800.0,
"paid": null,
"linkToPay": null,
"payBefore": null,
"allowBill": 0,
"orderCanceled": 0,
"qrCodeLink": null,
"reservationCurrency": "RUB"
},
"reservationTypes": [
{
"id": 7776624,
"arrivalDateTime": "2024-09-18T14:00:00",
"departureDateTime": "2024-09-19T12:00:00",
"roomTypeName": "Стандарт",
"tariffName": "Базовый",
"tariffDescription": null,
"mealsIncluded": 0,
"mealsType": null,
"bedPlace": null,
"numberOfGuests": 1,
"price": 2000.0,
"reservationCurrency": "RUB"
}
],
"guests": [
{
"id": 363089,
"name": "Иванов Иван Иванович",
"reservationID": 7776624,
"age": null,
"withoutBed": 0
}
],
"extraServices": [
{
"id": 7281232,
"serviceName": "Сауна",
"reservationID": 7776624,
"quantity": 1,
"price": 1500.0
}
]
}
}
Описание полей ответа
orderInfo:
| Поле | Тип | Описание |
|---|---|---|
hotelId |
int | ID отеля |
hotelName |
string | Название отеля |
hotelAddress |
string | Адрес |
hotelEmail |
string | Email отеля |
hotelPhones |
string | Телефоны |
hotelImage |
string | URL изображения |
bookingCode |
int | Код бронирования |
createDate |
DateTime | Дата создания |
customerName |
string | ФИО заказчика |
customerPhone |
string | Телефон заказчика |
customerEmail |
string | Email заказчика |
comment |
string | Комментарий |
paymentMethodName |
string | Способ оплаты |
accommodationPrice |
decimal | Стоимость проживания |
toPay |
decimal | К оплате |
prepayment |
decimal | Предоплата |
paid |
decimal? | Оплачено |
linkToPay |
string? | Ссылка на оплату |
payBefore |
DateTime? | Оплатить до |
allowBill |
int | Доступен счёт (1 = да) |
orderCanceled |
int | Заказ отменён (1 = да) |
qrCodeLink |
string? | Ссылка на QR-код |
reservationCurrency |
string | Валюта бронирования |
reservationTypes[]:
| Поле | Тип | Описание |
|---|---|---|
id |
int | ID бронирования |
arrivalDateTime |
DateTime | Дата и время заезда |
departureDateTime |
DateTime | Дата и время выезда |
roomTypeName |
string | Название категории |
tariffName |
string | Название тарифа |
mealsIncluded |
int | Питание включено (1 = да) |
mealsType |
string? | Тип питания |
numberOfGuests |
int | Число гостей |
price |
decimal | Стоимость |
reservationCurrency |
string | Валюта |
guests[]: id, name, reservationID, age, withoutBed
extraServices[]: id, serviceName, reservationID, quantity, price
annulOrder — Отмена бронирования
URL: POST /OnlineWidget3/online/v3/annulOrder
Назначение: Отмена (аннуляция) существующего заказа.
Запрос
{
"orderToken": "6c216700-28a8-480a-a4a0-9e3a253bce14",
"token": "EAAB810C-EE10-4ED9-BA1E-BC5112BB6AB9",
"annulDescription": "Причина отмены"
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
orderToken |
string | Да | Токен заказа (из putOrder) |
token |
string | Да | Токен отеля |
annulDescription |
string | Нет | Причина отмены |
Пример запроса (cURL)
curl --request POST \
--url https://cloud.shelter.ru/OnlineWidget3/online/v3/annulOrder \
--header 'content-type: application/json' \
--data '{
"orderToken": "6c216700-28a8-480a-a4a0-9e3a253bce14",
"token": "EAAB810C-EE10-4ED9-BA1E-BC5112BB6AB9",
"annulDescription": "Причина отмены"
}'
Ответ (успех)
{
"success": true,
"data": null,
"errors": null,
"notify": null
}
Ответ (ошибка)
{
"success": false,
"data": null,
"errors": [
{ "code": "500", "message": "Не удалось аннулировать заказ" }
],
"notify": null
}
getAvailableDates — Доступные даты
URL: POST /OnlineWidget3/online/v3/getAvailableDates
Назначение: Возвращает список дат, на которые возможно бронирование, с минимальной ценой по каждой дате. Используется для отображения календаря с ценами.
Не учитывает ограничения, которые могут быть указаны для бронирования конкретной даты.
Запрос
{
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A",
"currency": "RUB",
"dateFrom": "2024-08-27",
"dateTo": "2024-09-12",
"language": "ru",
"roomCategoryId": 39329,
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
currency |
string | Да | Валюта |
dateFrom |
string | Да | Начало периода |
dateTo |
string | Да | Конец периода |
roomCategoryId |
int | Нет | Фильтр по ID категории |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
Ответ
{
"success": true,
"data": [
{ "roomCategoryId": 39329, "date": "2024-09-18", "price": 5000.0 },
{ "roomCategoryId": 39329, "date": "2024-09-19", "price": 5000.0 }
]
}
| Поле | Тип | Описание |
|---|---|---|
roomCategoryId |
int | ID категории номера |
date |
string | Дата (yyyy-MM-dd) |
price |
decimal | Минимальная цена на дату |
checkPromoCode — Проверка промокода
URL: POST /OnlineWidget3/online/v3/checkPromoCode
Назначение: Проверяет корректность промокода.
Запрос
{
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A",
"promocode": "SUMMER2024"
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
promocode |
string | Да | Промокод для проверки |
Ответ
{
"success": true,
"data": {
"correct": true
}
}
| Поле | Тип | Описание |
|---|---|---|
correct |
bool | Промокод корректен |
login — Авторизация пользователя
URL: POST /OnlineWidget3/online/v3/login
Назначение: Авторизация пользователя. Возвращает токен пользователя для передачи в последующих запросах.
Запрос
{
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A",
"login": "user@example.com",
"password": "password123"
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
login |
string | Да | Логин |
password |
string | Да | Пароль |
Ответ
{
"success": true,
"data": {
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A"
}
}
| Поле | Тип | Описание |
|---|---|---|
token |
string | Токен авторизованного пользователя (передавать как userToken в другие методы) |
setRequest — Заявка на бронирование
URL: POST /OnlineWidget3/online/v3/setRequest
Назначение: Отправка заявки на бронирование (запрос без создания заказа). Заявка отправляется на почту отеля, указанную в поле «Email для заявок:» на вкладке «Онлайн для сайта v2.0».
Запрос
{
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A",
"language": "ru",
"currency": "RUB",
"comment": "Комментарий к заявке",
"contacts": "Телефон: 8-800-200-00-00",
"dateFrom": "2024-08-31",
"dateTo": "2024-09-01",
"userToken": ""
}
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
token |
string | Да | Токен отеля |
currency |
string | Да | Валюта |
comment |
string | Да | Комментарий к заявке |
contacts |
string | Да | Контактные данные |
dateFrom |
string | Да | Дата заезда |
dateTo |
string | Да | Дата выезда |
language |
string | Нет | Язык |
userToken |
string | Нет | Токен пользователя |
Ответ
{
"success": true,
"data": {
"token": "DCAE50E8-8795-4490-BC58-0C419B46F25A"
}
}
Устранение неполадок
Пустой массив результатов в getVariants
Проверьте:
- Лицензия на модуль «Бронирование онлайн» активна
- Категории номеров и тарифы настроены для онлайн-продаж
- Цены установлены на запрошенный период
- Нет ограничений по тарифам/категориям
Отладка через DevTools браузера
- Откройте сайт с виджетом бронирования
- Откройте DevTools (F12) → вкладка Network
- Установите фильтр «Fetch/XDR»
- Выполните поиск на виджете
- Найдите нужный запрос (getVariants и т.д.)

- Headers — URL и метод запроса
- Payload → View source — тело запроса

- Response — структура ответа

См. также:
- API виджета бронирования v1 — ExternalPrices API (
/externalPrices/*.aspx)- API виджета бронирования v2 — Cloud API v2 (
/api/online/)
Документация составлена на основе исходного кода OnlineWidget3.0.