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

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

Оглавление


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

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-документация:

Методы: getHotelData, getVariants, getExtraServices, getPaymentOptions, putOrder, getOrder, annulOrder, getAvailableDates, checkPromoCode, login, setRequest


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

API использует двухуровневую систему токенов:

  1. Токен отеля (token) — обязателен для всех методов. Идентифицирует отель. Формат UUID.
  2. Токен пользователя (userToken) — необязателен. Возвращается методом login после авторизации. Передаётся в последующих запросах для персонализации.

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

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

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

Вкладка «Онлайн 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 Да Email
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 Нет Email
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

Проверьте:

  1. Лицензия на модуль «Бронирование онлайн» активна
  2. Категории номеров и тарифы настроены для онлайн-продаж
  3. Цены установлены на запрошенный период
  4. Нет ограничений по тарифам/категориям

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

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

Вкладка Network в DevTools

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

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

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

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


См. также:

Документация составлена на основе исходного кода OnlineWidget3.0.