API виджета бронирования Shelter Cloud v2

Версия: v2 | Статус: Stable (основная версия) | Лицензия: Бронирование онлайн | Продукт: Shelter Cloud | Уровень: Дилерский

Оглавление


Общее описание

API предназначено для создания собственного модуля онлайн-бронирования на сайте отеля или сторонней платформе (версия v2).

Возможности API:

  • Получение параметров отеля: настройки виджета, справочники категорий номеров, тарифов и их опций
  • Поиск вариантов размещения по заданным параметрам (даты, количество номеров, состав гостей) с ценами
  • Получение доступных способов оплаты
  • Создание бронирования с данными гостей
  • Получение данных заказа для страницы подтверждения

Базовый URL: https://cloud.shelter.ru/api/online/

Резервный URL: https://pms.frontdesk24.ru/api/online/

Протокол: HTTPS, все методы — POST, формат данных — JSON.

Требование: Для работы API необходима активная лицензия на модуль «Бронирование онлайн». Без этого модуля API не будет функционировать.

Content-Type: application/json; charset=utf-8

Методы: getHotelParams, getVariants, getPaymentOptions, putOrder, getOrder

Postman-коллекция: Готовые запросы ко всем методам — OnlineWidgetAPI_v2.postman_collection.7z


Аутентификация

Все методы требуют указания токена в теле запроса (поле token).

Получение токена

  1. Войти в личный кабинет Shelter Cloud
  2. Нажать на имя пользователя в правом верхнем углу
  3. Перейти на вкладку «Онлайн v2»
  4. Нажать «Добавить виджет»
  5. Скопировать токен из блока «Код вставки»

Настройки пользователя

Вкладка «Онлайн v2»

Код вставки виджета

Токен имеет формат UUID: EE9217BE-2D5C-47AF-93D2-31B9EEFD3317


Типовой сценарий бронирования

1. Инициализация
   └── getHotelParams → настройки виджета, справочники опций

2. Поиск
   └── getVariants → категории, тарифы, фото, варианты с ценами
       Пользователь указывает даты, кол-во номеров, состав гостей

3. Выбор и оплата
   └── getPaymentOptions → доступные способы оплаты
       Пользователь выбирает вариант и заполняет данные

4. Бронирование
   └── putOrder → создание заказа, ссылка на оплату

5. Управление
   └── getOrder → детали заказа (страница подтверждения)

Методы API


getHotelParams — Параметры отеля

URL: POST https://cloud.shelter.ru/api/online/getHotelParams

Назначение: Возвращает настройки виджета и справочные данные отеля. Вызывается один раз при инициализации виджета.

Пример: Полный запрос и ответ — GetHotelParams.7z

Запрос

{
  "token": "EE9217BE-2D5C-47AF-93D2-31B9EEFD3317",
  "language": "ru"
}
Поле Тип Обяз. Описание
token string Да Токен виджета
language string Нет Язык (ru, en и т.д.)

Ответ

Ответ содержит массив data из 8 вложенных массивов. Порядок массивов фиксирован.

{
  "data": [
    [ /* Массив 1: Настройки виджета */ ],
    [ /* Массив 2: Промокоды */ ],
    [ /* Массив 3: Доступные языки */ ],
    [ /* Массив 4: Опции категорий номеров (справочник) */ ],
    [ /* Массив 5: Группы тарифов */ ],
    [ /* Массив 6: Опции тарифов (справочник) */ ],
    [ /* Массив 7: Категории номеров */ ],
    [ /* Массив 8: Данные отеля */ ]
  ]
}

Массив 1 — Настройки виджета:

{
  "allowBeds": 0,
  "minDateFrom": "2024-09-18T00:00:00",
  "defaultDateFrom": "2024-09-18T00:00:00",
  "defaultDateTo": "2024-09-19T00:00:00",
  "defaultNumberOfGuests": null,
  "minAgeOfChild": null,
  "maxAgeOfChild": null,
  "maxRoomCapacity": null,
  "allowRostourismProgram": false,
  "allowUpsale": true,
  "agreeText": null,
  "agreeUrl": null,
  "metrikaCounter": null,
  "metrikaGoalCalendar": null,
  "metrikaGoalSearch": null,
  "metrikaGoalBasket": null,
  "metrikaGoalBook": null,
  "metrikaGoalConfirm": null,
  "metrikaGoalOrder": null,
  "metrikaGoalPaid": null,
  "analyticsCounter": "123",
  "analyticsGoalCalendar": "1",
  "analyticsGoalSearch": "2",
  "analyticsGoalBasket": "3",
  "analyticsGoalBook": "4",
  "analyticsGoalOrder": "5",
  "analyticsGoalPaid": "6",
  "disableAuth": "0",
  "openPaymentInNewTab": true,
  "fullPaymentIncludeExtra": false,
  "askOnlyFirstGuest": false,
  "defaultPhoneCode": "7",
  "onlyBedPlaces": false
}
Поле Тип Описание
allowBeds int Разрешены койко-места (0 = только номера)
minDateFrom DateTime Минимальная дата заезда
defaultDateFrom DateTime Дата заезда по умолчанию
defaultDateTo DateTime Дата выезда по умолчанию
defaultNumberOfGuests int? Число гостей по умолчанию
minAgeOfChild int? Минимальный возраст ребёнка
maxAgeOfChild int? Максимальный возраст ребёнка
maxRoomCapacity int? Макс. гостей в номере
allowUpsale bool Включена продажа доп. услуг
agreeText string? Текст пользовательского соглашения
agreeUrl string? Ссылка на полный текст соглашения
metrikaCounter string? ID счётчика Яндекс.Метрики
metrikaGoal* string? Цели Яндекс.Метрики
analyticsCounter string? ID счётчика Google Analytics
analyticsGoal* string? Цели Google Analytics
disableAuth string "0" = авторизация включена
openPaymentInNewTab bool Платёжные ссылки в новом окне
askOnlyFirstGuest bool Запрашивать данные только первого гостя
defaultPhoneCode string Код телефона по умолчанию
onlyBedPlaces bool Виджет только для койко-мест

Массив 3 — Языки:

{ "id": "ru", "name": "Руccкий" }

Массив 4 — Опции категорий номеров:

{ "id": 2, "name": "Мини-бар", "url": "Content/Gallery/RoomOptions/bar.svg" }

Массив 5 — Группы тарифов:

{ "id": 23974, "name": "Базовый", "isPromotionGroup": false }

Массив 6 — Опции тарифов:

{
  "id": 2,
  "name": "Без предоплаты",
  "url": "Content/Gallery/TariffOptions/prepayment.svg",
  "isIncluded": false
}

Массив 7 — Категории номеров:

{ "id": 6930, "name": "Стандарт" }

Массив 8 — Данные отеля:

{ "hotelName": "Firefly hotel 2", "token": "EE9217BE-2D5C-47AF-93D2-31B9EEFD3317" }

getVariants — Поиск вариантов размещения

URL: POST https://cloud.shelter.ru/api/online/getVariants

Назначение: Основной метод поиска. Возвращает доступные варианты размещения с ценами для указанных дат и состава гостей.

Пример: Полный запрос и ответ — getVariants.7z

Запрос

{
  "token": "EE9217BE-2D5C-47AF-93D2-31B9EEFD3317",
  "dateFrom": "2024-09-18",
  "dateTo": "2024-09-19",
  "rooms": [
    {
      "adults": 2,
      "kidsAges": "7"
    }
  ]
}
Поле Тип Обяз. Описание
token string Да Токен виджета
dateFrom string Да Дата заезда (yyyy-MM-dd)
dateTo string Да Дата выезда (yyyy-MM-dd)
rooms array Да Список номеров для поиска
rooms[].adults int Да Число взрослых в номере
rooms[].kidsAges string Нет Возраста детей через запятую (напр. "7,3"). Не передавать если детей нет

Логика подбора номеров

Система автоматически определяет подходящие номера и рассаживает гостей:

  • Номер подходит, если основных мест + доп. мест >= запрошенное кол-во гостей
  • Сначала занимаются основные места, затем дополнительные
  • Гости рассаживаются начиная со взрослых
  • Пример: номер (2 основных + 1 доп.) при поиске на 1 взрослого + 1 ребёнка + 1 младенца → взрослый и ребёнок на основные места, младенец на доп. место

Ответ

Массив data содержит 6 вложенных массивов. Порядок следования обязателен.

{
  "data": [
    [ /* Массив 1: Категории номеров */ ],
    [ /* Массив 2: Опции категорий */ ],
    [ /* Массив 3: Тарифы и акции */ ],
    [ /* Массив 4: Опции тарифов */ ],
    [ /* Массив 5: Фото и видео */ ],
    [ /* Массив 6: Варианты бронирования */ ]
  ]
}

Массив 1 — Категории номеров:

{
  "id": 6930,
  "name": "Стандарт",
  "description": null,
  "availableRooms": 3,
  "availableBeds": 0,
  "roomArea": null,
  "mainBeds": 4,
  "extraBeds": 0,
  "withoutBeds": null,
  "allowConnectBeds": 0
}
Поле Тип Описание
id int ID категории номера
name string Название
description string? Описание
availableRooms int Кол-во доступных номеров
availableBeds int Кол-во доступных койко-мест
roomArea string? Площадь номера
mainBeds int Основных мест
extraBeds int Дополнительных мест
withoutBeds int? Разрешено младенцев без места
allowConnectBeds int Кровати сдвигаются (1 = да)

Массив 2 — Опции категорий:

{
  "roomCategoryID": 6930,
  "roomCategoryOptionID": 2
}

Связывает категорию номера с опцией из справочника getHotelParams (массив 4).

Массив 3 — Тарифы и акции:

{
  "id": 23974,
  "name": "Базовый",
  "isPromotion": false,
  "description": null,
  "image": null
}
Поле Тип Описание
id int ID тарифа или акции
name string Название
isPromotion bool true = акция, false = тариф
description string? Описание
image string? URL изображения

Массив 4 — Опции тарифов:

{
  "tariffID": 23974,
  "isPromotion": false,
  "tariffOptionID": 2
}

Связывает тариф с опцией из справочника getHotelParams (массив 6).

Массив 5 — Фото и видео:

{
  "roomCategoryID": 6930,
  "url": "Content/Gallery/RoomTypes/no-image-grey.jpg",
  "urlLarge": "Content/Gallery/RoomTypes/no-image-grey.jpg",
  "isVideo": false
}
Поле Тип Описание
roomCategoryID int ID категории номера
url string Ссылка на фото/видео
urlLarge string Ссылка для Retina-дисплеев
isVideo bool true = видео, false = фото

Массив 6 — Варианты бронирования (основной):

{
  "roomCategoryID": 6930,
  "tariffID": 23974,
  "TariffOrder": null,
  "isPromotion": false,
  "bedPlace": false,
  "accmdId": 25203,
  "accmdName": "Основное",
  "price": 5000,
  "currency": null,
  "priceRub": 5000,
  "totalDiscountPercent": 0,
  "promocodeDiscountPercent": 0,
  "promotionDiscountPercent": 0,
  "priceWithoutDiscount": 5000,
  "prepaymentRub": 0,
  "prepaymentCurrency": 0,
  "amountOfAdults": 2,
  "amountOfChildrenWithBeds": 1,
  "KidAge": null,
  "amountOfChildrenWithoutBeds": null,
  "countGuestsOnMainAccmd": 3,
  "countGuestsOnExtraAccmd": 0,
  "countGuestsOnWithoutBed": 0,
  "agesOfChildrenWithBeds": "7",
  "agesOfChildrenWithoutBeds": null,
  "cashbackRub": null
}
Поле Тип Описание
roomCategoryID int ID категории номера
tariffID int ID тарифа
TariffOrder int? Порядок сортировки тарифа
isPromotion bool Признак акции
bedPlace bool true = вариант за койко-место
accmdId int ID размещения
accmdName string Название размещения
price decimal Цена варианта
priceRub decimal Цена в рублях
totalDiscountPercent decimal Общий % скидки
promocodeDiscountPercent decimal % скидки по промокоду
promotionDiscountPercent decimal % скидки по акции
priceWithoutDiscount decimal Цена до скидок
prepaymentRub decimal Размер требуемой предоплаты
amountOfAdults int Число взрослых
amountOfChildrenWithBeds int Число детей с местом
KidAge int? Возраст ребёнка (для койко-мест)
amountOfChildrenWithoutBeds int? Число детей без места
countGuestsOnMainAccmd int Гостей на основных местах
countGuestsOnExtraAccmd int Гостей на доп. местах
countGuestsOnWithoutBed int Гостей без места
agesOfChildrenWithBeds string? Возраста детей с местом (через запятую)
agesOfChildrenWithoutBeds string? Возраста детей без места

Важно: Каждый вариант из getVariants использует свой уникальный signatureId (не показан в примере, но передаётся в ответе). Этот signatureId необходимо передать в putOrder.


getPaymentOptions — Способы оплаты

URL: POST https://cloud.shelter.ru/api/online/getPaymentOptions

Назначение: Возвращает доступные способы оплаты для выбранного варианта бронирования.

Пример: Полный запрос и ответ — GetPaymentOptions.7z

Запрос

{
  "token": "EE9217BE-2D5C-47AF-93D2-31B9EEFD3317",
  "extraServicesSum": 0,
  "dateFrom": "2024-09-18",
  "dateTo": "2024-09-19",
  "amountOfAdults": 1,
  "amountOfChildren": 1,
  "ageOfChildren": "7",
  "roomCategoriesIDs": "6930",
  "numberOfRooms": 1,
  "tariffsIDs": "23974",
  "promotionsIDs": "",
  "bedPlace": "0",
  "onlyRostourismProgram": false
}
Поле Тип Обяз. Описание
token string Да Токен виджета
extraServicesSum decimal Да Стоимость выбранных доп. услуг (0 если нет)
dateFrom string Да Дата заезда
dateTo string Да Дата выезда
amountOfAdults int Да Число взрослых
amountOfChildren int Да Число детей
ageOfChildren string Нет Возраста детей через запятую
roomCategoriesIDs string Да ID категорий номеров через запятую
numberOfRooms int Да Число номеров
tariffsIDs string Да ID тарифов через запятую
promotionsIDs string Нет ID акций через запятую
bedPlace string Да "0" = номер, "1" = койко-место

Ответ

{
  "data": [
    {
      "id": 2,
      "name": "Оплата в отеле",
      "description": "Оплата при заезде наличными или картой",
      "image": "Content/Gallery/PaymentTypes/hotel-payment.svg",
      "paymentKind": null
    }
  ]
}
Поле Тип Описание
id int ID способа оплаты
name string Название
description string Описание
image string URL иконки
paymentKind string? Тип платёжной системы

putOrder — Создание бронирования

URL: POST https://cloud.shelter.ru/api/online/putOrder

Назначение: Создаёт новое бронирование. Возвращает данные заказа, включая ссылку на оплату (при необходимости).

Пример: Полный запрос и ответ — putOrder.7z

Запрос

{
  "data": {
    "token": "EE9217BE-2D5C-47AF-93D2-31B9EEFD3317",
    "source": "hotel-website.ru",
    "paymentMethodID": 2,
    "comment": "Комментарий от гостя",
    "customer": {
      "email": "guest@example.com",
      "phone": "+79161234567",
      "surname": "Иванов",
      "name": "Иван",
      "secondName": "Иванович"
    },
    "reservations": [
      {
        "dateFrom": "2024-09-18",
        "dateTo": "2024-09-19",
        "roomCategoryID": 6930,
        "tariffID": 23974,
        "isPromotion": 0,
        "promocode": null,
        "guestsCount": 2,
        "bedPlace": 0,
        "currency": "",
        "price": 5000,
        "totalDiscountPercent": 0,
        "promocodeDiscountPercent": 0,
        "promotionDiscountPercent": 0,
        "priceWithoutDiscount": 5000,
        "priceRub": 5000,
        "prepaymentRub": 0,
        "prepaymentCurrency": 0,
        "guests": [
          {
            "surname": "Иванов",
            "name": "Иван",
            "secondName": "Иванович",
            "email": "guest@example.com",
            "phone": "+79161234567",
            "withoutBed": false
          },
          {
            "surname": "Иванова",
            "name": "Мария",
            "secondName": "",
            "age": 7,
            "withoutBed": false
          }
        ]
      }
    ],
    "extraServices": []
  }
}

Описание полей запроса

Корневой объект data:

Поле Тип Обяз. Описание
token string Да Токен виджета
source string Нет Сайт, с которого бронирование
paymentMethodID int Да ID способа оплаты (из getPaymentOptions)
comment string Нет Примечание от гостя
customer object Да Данные заказчика
reservations array Да Массив бронирований (каждый номер — отдельное)
extraServices array Нет Доп. услуги (передавать пустым массивом)

Объект customer (заказчик):

Поле Тип Обяз. Описание
email string Да Email
phone string Да Телефон
surname string Да Фамилия
name string Да Имя
secondName string Нет Отчество

Объект бронирования (элемент reservations):

Поле Тип Обяз. Описание
dateFrom string Да Дата заезда (yyyy-MM-dd)
dateTo string Да Дата выезда (yyyy-MM-dd)
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 Да Цена в рублях (= price)
prepaymentRub decimal Да Размер требуемой предоплаты
prepaymentCurrency decimal Да Передавать 0
guests array Да Список гостей

Рекомендуется передавать сначала взрослых, потом детей. Количество гостей в массиве не обязано совпадать с guestsCount.

Объект гостя (элемент guests):

Поле Тип Обяз. Описание
surname string Да Фамилия
name string Да Имя
secondName string Нет Отчество
email string Нет Email
phone string Нет Телефон
age int Нет Возраст (для детей)
withoutBed bool Нет true = гость без места

Ответ

Массив data содержит 4 вложенных массива:

{
  "data": [
    [ /* Массив 1: Информация о заказе */ ],
    [ /* Массив 2: Бронирования */ ],
    [ /* Массив 3: Гости */ ],
    [ /* Массив 4: Доп. услуги */ ]
  ]
}

Массив 1 — Информация о заказе:

{
  "hotelId": 2398,
  "hotelName": "Firefly hotel 2",
  "hotelAddress": "",
  "hotelLocation": null,
  "hotelEmail": "",
  "hotelPhones": "",
  "hotelImage": "Content/Images/2398_Hotels_638539579700390206_x450.jpg",
  "hotelLocation1": null,
  "bookingCode": 117,
  "createDate": "2024-09-18T14:55:49.187",
  "customerName": "Иванов Иван Иванович",
  "customerPhone": "+79161234567",
  "customerEmail": "guest@example.com",
  "comment": "Комментарий от гостя",
  "paymentMethodName": "Оплата в отеле",
  "accommodationPrice": 5000.0,
  "toPay": 5000.0,
  "prepayment": 5000.0,
  "paid": null,
  "linkToPay": null,
  "payBefore": null,
  "allowBill": 0,
  "orderCanceled": 0,
  "qrCodeLink": "https://cloud.shelter.ru/qrcoder/getqrcode.aspx?...",
  "reservationCurrency": null
}
Поле Тип Описание
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-код для оплаты

Массив 2 — Бронирования:

{
  "id": 10931732,
  "arrivalDateTime": "2024-09-18T14:00:00",
  "departureDateTime": "2024-09-19T12:00:00",
  "roomTypeName": "Стандарт",
  "tariffName": "Базовый",
  "tariffDescription": null,
  "mealsIncluded": 0,
  "mealsType": null,
  "bedPlace": null,
  "numberOfGuests": 2,
  "price": 5000.0,
  "reservationCurrency": null
}
Поле Тип Описание
id int ID бронирования
arrivalDateTime DateTime Дата и время заезда
departureDateTime DateTime Дата и время выезда
roomTypeName string Название категории
tariffName string Название тарифа
tariffDescription string? Описание тарифа
mealsIncluded int Питание включено (1 = да)
mealsType string? Тип питания
bedPlace int? Койко-место
numberOfGuests int Число гостей
price decimal Стоимость

Массив 3 — Гости:

{
  "id": 13399971,
  "name": "Иванов Иван Иванович",
  "reservationID": 10931732,
  "age": null,
  "withoutBed": 0
}

Массив 4 — Доп. услуги: (пустой массив если не заказаны)


getOrder — Получение данных заказа

URL: POST https://cloud.shelter.ru/api/online/getOrder

Назначение: Получает данные созданного заказа для отображения страницы подтверждения.

Запрос

{
  "orderToken": "9bb11772-2843-4449-a766-84fa8c5c100b"
}
Поле Тип Обяз. Описание
orderToken string Да GUID заказа (из ответа putOrder)

Ответ

Формат ответа аналогичен putOrder (те же 4 массива).


Коды ошибок

Ошибка signatureId в putOrder

Код: 0400 Сообщение: "Не совпадают рассчитанная и входящая сигнатура"

Причина: Неверный или отсутствующий signatureId в запросе putOrder.

Решение: Каждый вариант из ответа getVariants содержит уникальный signatureId. Необходимо передать его в соответствующем бронировании putOrder.


Устранение неполадок

Пустой массив результатов в getVariants

Проверьте:

  1. Модуль онлайн-бронирования активен в тарифном плане Shelter Cloud
  2. Если модуль отсутствует, проверьте через авто-сгенерированный сайт:
    • Перейдите: Shelter Cloud → Имя пользователя → Настройки → Онлайн для сайта v2.0 → Автосайты
    • Заполните поле «Отель синоним для ссылки»
    • Откройте сгенерированную ссылку
    • Проверьте наличие номеров на запрошенные даты
  3. Категории номеров и тарифы настроены для онлайн-продаж
  4. Нет ограничений по тарифам/категориям
  5. Цены установлены на запрошенный период

Отладка через DevTools браузера

  1. Откройте авто-сгенерированный сайт с модулем бронирования
  2. Откройте DevTools (F12) → вкладка Network
  3. Установите фильтр «Fetch/XDR»
  4. Выполните поиск на виджете
  5. Найдите нужный запрос (getVariants и т.д.)

Вкладка Network в DevTools

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

Тело запроса в Payload

  1. Response — структура ответа

Ответ сервера

  1. Скопируйте данные в API-клиент (Postman/Bruno) для тестирования

Примеры запросов и коллекция Postman

Архивы с примерами запросов/ответов для всех методов и готовая Postman-коллекция:

Метод Пример
getHotelParams GetHotelParams.7z
getVariants getVariants.7z
getPaymentOptions GetPaymentOptions.7z
putOrder putOrder.7z
annulOrder (v3) annulOrder.7z

Полная коллекция: OnlineWidgetAPI_v2.postman_collection.7z — предварительно настроенные запросы для всех методов.


См. также:

Документация составлена на основе Postman-коллекции OnlineWidgetAPI_v2 и описания API на shelter.ru.