Hostme | Столы и залы

Столы и залы

Обновлено: 2026-06-24 17:30 MSK

Эта группа эндпоинтов описывает физическую структуру ресторана: залы (floors), зоны (areas), столы (tables) и их текущее состояние в зале (свободен/занят/бронь). Партнёру это нужно, чтобы прочитать карту посадки, узнать вместимость и статусы столов в реальном времени, а также построить план зала.

Все эндпоинты — под Bearer-токеном (см. Аутентификация). Базовый путь управления столами: /api/tm/admin/restaurants/{restaurantId}.

МетодПутьНазначение
GET/tablesСписок столов с вместимостью и доступностью
GET/floorareasСводка по зонам (areas) каждого зала
GET/floorsСписок залов с агрегатами
GET/floors/{floorId}Один зал (план/карта)
GET/tables/monitorsСостояние столов в реальном времени
GET/tables/timelineТаймлайн занятости столов за день
GET/tables/settingsНастройки столов (комбинации, блокировки)
PUT/tables/stateСменить состояние брони за столом
POST/PUT/DELETE/floors, /floors/{floorId}Управление залами (CRUD)
POST/floor-plan/imageСгенерировать план зала по фото

Важно про термины. В Hostme «зал» (floor) — это отдельная карта посадки, у него есть floorId, имя и опциональная фоновая карта. «Зона» (area) — текстовая группировка столов внутри зала (например «Терраса», «У окна»). У стола поля area и привязка к залу.


GET /tables — список столов

Возвращает все столы ресторана с их вместимостью, зоной, тегами и правилами доступности (для брони и для листа ожидания). Это основной справочник столов для партнёрской интеграции.

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
includeEventsquerybooleanВключать столы, относящиеся к событиям

Ключевые поля стола (TableContract)

ПолеТипОписание
tableNumberstringНомер/имя стола (основной идентификатор стола в операциях)
tableTopSizeintegerВместимость стола (число мест)
areastringЗона, к которой относится стол
tagsarray<string>Произвольные теги стола
isOfflinebooleanСтол выключен из работы (недоступен)
eventIdinteger?ID события, если стол привязан к событию
eventStartDate / eventEndDatedate-time?Период события для стола
reservabilityobjectПравила доступности для онлайн-брони (TableAvailabilityContract)
waitabilityobjectПравила доступности для листа ожидания (TableAvailabilityContract)

Объект доступности (TableAvailabilityContract)

Одинаковая структура у reservability и waitability:

ПолеТипОписание
reservablebooleanДоступен ли стол для брони/ожидания
minCoversRequiredintegerМинимум гостей для посадки за этот стол
depositAmountstring?Требуемый депозит (если задан)
descriptionstring?Пояснение/условия
hoursarrayЧасы доступности по дням недели (WeekDayOpenHoursContract)

Каждый элемент hours содержит weekDay (число дня недели) и массив интервалов time с полями open / close (формат date-span, время от полуночи) и опциональным name.

Пример

curl -G https://api.hostmeapp.com/api/tm/admin/restaurants/123/tables \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "includeEvents=false"

GET /floorareas — сводка по зонам

Возвращает агрегированную статистику по каждой зоне (area) внутри каждого зала: сколько столов и мест всего, и сколько из них доступно онлайн. Удобно для дашбордов вместимости.

ПараметрГдеТип
restaurantId *pathinteger

Поля ответа (FloorAreaContract)

ПолеТипОписание
floorIdstringЗал, которому принадлежит зона
floorNamestringИмя зала
areastringНазвание зоны
tablesintegerВсего столов в зоне
onlineTablesintegerСтолов, доступных онлайн
coversintegerВсего мест (посадочных)
onlineCoversintegerМест, доступных онлайн
curl https://api.hostmeapp.com/api/tm/admin/restaurants/123/floorareas \
  -H "Authorization: Bearer $TOKEN"

GET /floors — список залов

Возвращает залы ресторана с агрегатами по столам и местам. Параметры includeOffline и includeEvents управляют включением выключенных залов и залов событий.

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
includeOfflinequerybooleanВключать выключенные (offline) залы
includeEventsquerybooleanВключать залы, относящиеся к событиям

Поля ответа (FloorInfoContract)

ПолеТипОписание
floorIdstringИдентификатор зала
namestringИмя зала
floorUrlstringСсылка на изображение/карту зала
isOfflinebooleanЗал выключен из работы
tablesintegerВсего столов
tableNumbersstringПеречень номеров столов
onlineTablesintegerСтолов доступно онлайн
coversintegerВсего мест
onlineCoversintegerМест доступно онлайн
eventobject?Информация о событии (EventInfoContract: id, name, tickets[]), если это зал события
curl -G https://api.hostmeapp.com/api/tm/admin/restaurants/123/floors \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "includeOffline=false"

GET /floors/{floorId} — один зал

Возвращает данные конкретного зала по floorId (имя, карта/план, флаг offline). Используйте для подгрузки фоновой схемы зала.

ПараметрГдеТип
restaurantId *pathinteger
floorId *pathstring

Точная схема успешного ответа (200) в спецификации не зафиксирована. По структуре зала ориентируйтесь на FloorContract (см. раздел «Управление залами» ниже): floorId, name, map, floorUrl, isOffline.


GET /tables/monitors — состояние столов в реальном времени

Возвращает «снимок» зала: открыт ли ресторан и текущее состояние каждого стола (свободен, занят, бронь и т.п.), включая привязанного гостя, официантов и тайминги посадки. Это основной эндпоинт для отображения живой карты зала.

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
WithNextSlotquerybooleanВключать время ближайшего свободного слота
Timequerydate-timeМомент времени, на который считается состояние
TableTurnOverqueryintegerРасчётное время оборота стола, мин
ExcludeIdquerystringИсключить бронь из расчёта (например, текущую)

Структура ответа (RestaurantState)

ПолеТипОписание
isOpenbooleanОткрыт ли ресторан сейчас
monitorsarrayСостояние столов (TableMonitorContract)
eventsarrayАктивные события (EventInfoContract)

Поля стола-монитора (TableMonitorContract)

ПолеТипОписание
idstringИдентификатор стола
tableNumberstringНомер/имя стола
statestringТекстовое состояние стола
typestringТип стола
statusenumЧисловой статус стола: 0, 1, 2, 3, 4 (см. ниже)
eventIdinteger?Событие, если стол к нему привязан
registrationTimedate-time?Время регистрации гостя
reservationTimedate-time?Время брони
assignmentTimedate-time?Время назначения стола
estimatedReleaseTimedate-time?Ожидаемое освобождение
nextAvailableSlotTimedate-time?Ближайший свободный слот (при WithNextSlot=true)
userobjectДанные текущей посадки/брони (TableUserInfoContract): гость, groupSize, официанты, профиль, пожелания

Статусы стола (TableStatus)

Поле status — целочисленный enum со значениями 0…4. Точные подписи к числам в спецификации не зафиксированы; ориентируйтесь на текстовое поле state как на человекочитаемое состояние, а status используйте как стабильный машинный код. Не зашивайте смысл чисел жёстко — сверяйтесь с state.

curl -G https://api.hostmeapp.com/api/tm/admin/restaurants/123/tables/monitors \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "Time=2026-07-01T19:00:00" \
  --data-urlencode "WithNextSlot=true"

GET /tables/timeline — таймлайн занятости

Возвращает снимки состояния зала по ходу дня — для построения временной шкалы загрузки столов. Помимо состояния каждого стола включает агрегаты по гостям (посажено, ожидает, забронировано) и прогресс-бары оборота.

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
DatequerydateДень, за который строится таймлайн
TableTurnOverqueryintegerРасчётное время оборота стола, мин
ExcludeIdquerystringИсключить бронь из расчёта

Структура ответа (FloorStateTimeline)

ПолеТипОписание
lastActiveSlotdate-spanПоследний активный слот дня
snapshotsUpdatedAtdate-timeКогда снимки пересчитаны
snapshotsarrayСнимки по времени (FloorTablesSnapshot)

Каждый FloorTablesSnapshot содержит время (dateTime, timestamp, shiftDate), агрегаты (tablesCount, busyTablesCount, groupTotalMembers, seatedMembersCount, reservationMembersCount, waitingMembersCount) и массив monitors (TableTimelineContract) с тем же набором статусов/таймингов, что и в /tables/monitors, плюс прогресс-бары стола (tableProgressBar) и карточки (cardProgressBar).

curl -G https://api.hostmeapp.com/api/tm/admin/restaurants/123/tables/timeline \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "Date=2026-07-01"

Пересчёт таймлайна можно инициировать вручную: POST /tables/timeline/recalculate (без тела).


GET /tables/settings — настройки столов

Возвращает правила комбинирования и блокировок столов. Эти настройки влияют на то, как система подбирает столы под бронь. Чтение — GET, изменение — PUT с телом TablesSettingsContract.

ПараметрГдеТип
restaurantId *pathinteger

Поля настроек (TablesSettingsContract, для PUT)

ПолеТипОписание
blockingPeriodsarrayПериоды блокировки столов (BlockingPeriodContract: tables[], starts, ends, time[])
tableCombinationsarrayЗаданные комбинации столов (TableCombinationContract: tables[], minCovers, maxCovers, isForOnline, enabled)
onlyPresetCombinationsbooleanРазрешать только заранее заданные комбинации
passwordstring?Пароль на изменение настроек (если используется)
curl https://api.hostmeapp.com/api/tm/admin/restaurants/123/tables/settings \
  -H "Authorization: Bearer $TOKEN"

PUT /tables/state — сменить состояние стола

Меняет состояние брони/посадки за столом (например, перевести гостя в «занят», «завершён» и т.п.). Тело — ChangeTableStateContract.

ПолеТипОписание
bookingIdstringИдентификатор брони/посадки
statestringНовое состояние

Ответ — обновлённая бронь (BookingContract) с актуальными статусом и таймингами.

curl -X PUT https://api.hostmeapp.com/api/tm/admin/restaurants/123/tables/state \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "bookingId": "ABC_ID", "state": "Seated" }'

Освобождение стола. Отдельно есть PUT /tables/{bookingId}/release (освободить стол по брони) и POST /tables/release (массовое освобождение). Посадка/назначение стола брони — через PUT /seat/{registrationId} (тело RegisterAtTableContract). Эти операции относятся к работе хоста в зале; см. также Бронирования.


Управление залами (CRUD) — обзор

Создание, изменение и удаление залов. Партнёру эти операции нужны редко (структуру обычно ведёт персонал ресторана), поэтому ниже — кратко.

МетодПутьНазначение
POST/floorsСоздать зал
PUT/floors/{floorId}Изменить зал
DELETE/floors/{floorId}Удалить зал

Тело создания/изменения — FloorContract:

ПолеТипОписание
floorIdstring?Идентификатор зала (при изменении)
namestring?Имя зала
mapstring?План зала (DSL/разметка карты посадки)
floorUrlstring?Ссылка на изображение-подложку
isOfflinebooleanВыключить зал из работы
curl -X POST https://api.hostmeapp.com/api/tm/admin/restaurants/123/floors \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Терраса", "isOffline": false }'

Также доступен GET /merge?ids=... — служебная операция объединения столов; для типовой партнёрской интеграции не требуется.


POST /floor-plan/image — план зала по фотографии

Принимает фотографию плана зала (уменьшенный JPEG, ≤1024px по длинной стороне, в Base64) и возвращает сгенерированный план в формате PlanDSL (JSON). Распознавание выполняет двухпроходная vision-модель Gemini 2.5 Flash с автоматическим запасным провайдером (OpenRouter) при исчерпании квоты. Путь: /api/restaurants/{restaurantId}/floor-plan/image.

ПараметрГдеТип
restaurantId *pathinteger

Тело запроса (FloorPlanFromImageRequest)

ПолеТипОписание
imageBase64 *stringИзображение JPEG, закодированное в Base64
contentType *stringMIME-тип; должен быть image/jpeg

Ответ (FloorPlanFromImageResponse)

ПолеТипОписание
planDSLstringJSON-строка PlanDSL, сгенерированная моделью
modelUsedstring?Какой провайдер обработал запрос (Gemini или OpenRouter)
tokensUsedinteger?Сколько токенов израсходовано (для учёта стоимости)
curl -X POST https://api.hostmeapp.com/api/restaurants/123/floor-plan/image \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "imageBase64": "/9j/4AAQSkZJRg...", "contentType": "image/jpeg" }'

Клиент сам уменьшает изображение до ≤1024px перед отправкой. Полученный planDSL можно сохранить в поле map зала (FloorContract).


Общие правила (заголовки, формат ошибок ProblemDetails, коды ответов) — в разделах Соглашения и Ошибки. Жизненный цикл броней за столами — в Бронированиях.