Столы и залы
Обновлено: 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 * | path | integer | Идентификатор ресторана |
includeEvents | query | boolean | Включать столы, относящиеся к событиям |
Ключевые поля стола (TableContract)
| Поле | Тип | Описание |
|---|---|---|
tableNumber | string | Номер/имя стола (основной идентификатор стола в операциях) |
tableTopSize | integer | Вместимость стола (число мест) |
area | string | Зона, к которой относится стол |
tags | array<string> | Произвольные теги стола |
isOffline | boolean | Стол выключен из работы (недоступен) |
eventId | integer? | ID события, если стол привязан к событию |
eventStartDate / eventEndDate | date-time? | Период события для стола |
reservability | object | Правила доступности для онлайн-брони (TableAvailabilityContract) |
waitability | object | Правила доступности для листа ожидания (TableAvailabilityContract) |
Объект доступности (TableAvailabilityContract)
Одинаковая структура у reservability и waitability:
| Поле | Тип | Описание |
|---|---|---|
reservable | boolean | Доступен ли стол для брони/ожидания |
minCoversRequired | integer | Минимум гостей для посадки за этот стол |
depositAmount | string? | Требуемый депозит (если задан) |
description | string? | Пояснение/условия |
hours | array | Часы доступности по дням недели (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 * | path | integer |
Поля ответа (FloorAreaContract)
| Поле | Тип | Описание |
|---|---|---|
floorId | string | Зал, которому принадлежит зона |
floorName | string | Имя зала |
area | string | Название зоны |
tables | integer | Всего столов в зоне |
onlineTables | integer | Столов, доступных онлайн |
covers | integer | Всего мест (посадочных) |
onlineCovers | integer | Мест, доступных онлайн |
curl https://api.hostmeapp.com/api/tm/admin/restaurants/123/floorareas \ -H "Authorization: Bearer $TOKEN"
GET /floors — список залов
Возвращает залы ресторана с агрегатами по столам и местам. Параметры includeOffline и includeEvents управляют включением выключенных залов и залов событий.
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
includeOffline | query | boolean | Включать выключенные (offline) залы |
includeEvents | query | boolean | Включать залы, относящиеся к событиям |
Поля ответа (FloorInfoContract)
| Поле | Тип | Описание |
|---|---|---|
floorId | string | Идентификатор зала |
name | string | Имя зала |
floorUrl | string | Ссылка на изображение/карту зала |
isOffline | boolean | Зал выключен из работы |
tables | integer | Всего столов |
tableNumbers | string | Перечень номеров столов |
onlineTables | integer | Столов доступно онлайн |
covers | integer | Всего мест |
onlineCovers | integer | Мест доступно онлайн |
event | object? | Информация о событии (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 * | path | integer |
floorId * | path | string |
Точная схема успешного ответа (200) в спецификации не зафиксирована. По структуре зала ориентируйтесь на
FloorContract(см. раздел «Управление залами» ниже):floorId,name,map,floorUrl,isOffline.
GET /tables/monitors — состояние столов в реальном времени
Возвращает «снимок» зала: открыт ли ресторан и текущее состояние каждого стола (свободен, занят, бронь и т.п.), включая привязанного гостя, официантов и тайминги посадки. Это основной эндпоинт для отображения живой карты зала.
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
WithNextSlot | query | boolean | Включать время ближайшего свободного слота |
Time | query | date-time | Момент времени, на который считается состояние |
TableTurnOver | query | integer | Расчётное время оборота стола, мин |
ExcludeId | query | string | Исключить бронь из расчёта (например, текущую) |
Структура ответа (RestaurantState)
| Поле | Тип | Описание |
|---|---|---|
isOpen | boolean | Открыт ли ресторан сейчас |
monitors | array | Состояние столов (TableMonitorContract) |
events | array | Активные события (EventInfoContract) |
Поля стола-монитора (TableMonitorContract)
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор стола |
tableNumber | string | Номер/имя стола |
state | string | Текстовое состояние стола |
type | string | Тип стола |
status | enum | Числовой статус стола: 0, 1, 2, 3, 4 (см. ниже) |
eventId | integer? | Событие, если стол к нему привязан |
registrationTime | date-time? | Время регистрации гостя |
reservationTime | date-time? | Время брони |
assignmentTime | date-time? | Время назначения стола |
estimatedReleaseTime | date-time? | Ожидаемое освобождение |
nextAvailableSlotTime | date-time? | Ближайший свободный слот (при WithNextSlot=true) |
user | object | Данные текущей посадки/брони (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 * | path | integer | Идентификатор ресторана |
Date | query | date | День, за который строится таймлайн |
TableTurnOver | query | integer | Расчётное время оборота стола, мин |
ExcludeId | query | string | Исключить бронь из расчёта |
Структура ответа (FloorStateTimeline)
| Поле | Тип | Описание |
|---|---|---|
lastActiveSlot | date-span | Последний активный слот дня |
snapshotsUpdatedAt | date-time | Когда снимки пересчитаны |
snapshots | array | Снимки по времени (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 * | path | integer |
Поля настроек (TablesSettingsContract, для PUT)
| Поле | Тип | Описание |
|---|---|---|
blockingPeriods | array | Периоды блокировки столов (BlockingPeriodContract: tables[], starts, ends, time[]) |
tableCombinations | array | Заданные комбинации столов (TableCombinationContract: tables[], minCovers, maxCovers, isForOnline, enabled) |
onlyPresetCombinations | boolean | Разрешать только заранее заданные комбинации |
password | string? | Пароль на изменение настроек (если используется) |
curl https://api.hostmeapp.com/api/tm/admin/restaurants/123/tables/settings \ -H "Authorization: Bearer $TOKEN"
PUT /tables/state — сменить состояние стола
Меняет состояние брони/посадки за столом (например, перевести гостя в «занят», «завершён» и т.п.). Тело — ChangeTableStateContract.
| Поле | Тип | Описание |
|---|---|---|
bookingId | string | Идентификатор брони/посадки |
state | string | Новое состояние |
Ответ — обновлённая бронь (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:
| Поле | Тип | Описание |
|---|---|---|
floorId | string? | Идентификатор зала (при изменении) |
name | string? | Имя зала |
map | string? | План зала (DSL/разметка карты посадки) |
floorUrl | string? | Ссылка на изображение-подложку |
isOffline | boolean | Выключить зал из работы |
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 * | path | integer |
Тело запроса (FloorPlanFromImageRequest)
| Поле | Тип | Описание |
|---|---|---|
imageBase64 * | string | Изображение JPEG, закодированное в Base64 |
contentType * | string | MIME-тип; должен быть image/jpeg |
Ответ (FloorPlanFromImageResponse)
| Поле | Тип | Описание |
|---|---|---|
planDSL | string | JSON-строка PlanDSL, сгенерированная моделью |
modelUsed | string? | Какой провайдер обработал запрос (Gemini или OpenRouter) |
tokensUsed | integer? | Сколько токенов израсходовано (для учёта стоимости) |
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, коды ответов) — в разделах Соглашения и Ошибки. Жизненный цикл броней за столами — в Бронированиях.