Гостевая книга
Обновлено: 2026-06-25 00:15 MSK
Работа с базой гостей ресторана: список, поиск, создание и редактирование профилей, карточка гостя с историей визитов. Через эти эндпоинты партнёрское приложение (CRM, POS, маркетинговый сервис) может синхронизировать клиентскую базу, обогащать профили предпочтениями гостей и получать историю их посещений.
Все эндпоинты — под Bearer-токеном (см. Аутентификация). Общие соглашения по запросам и формату ошибок — в разделах Соглашения и Ошибки.
Базовый путь: /api/loyalty/admin/restaurants/{restaurantId}/....
Исторически база гостей обслуживается под префиксом
/api/loyalty/..., а сущность в API называетсяmember. В этой документации это просто гость — без привязки к программе лояльности.
| Метод | Путь | Назначение |
|---|---|---|
GET | /members | Список гостей (OData-фильтры) |
POST | /members | Создать гостя |
GET | /members/{memberId} | Получить гостя по ID |
PUT | /members/{memberId} | Обновить гостя |
DELETE | /members/{memberId} | Удалить гостя |
GET | /members/find | Найти по номеру телефона |
GET | /members/email/{email} | Найти по email |
GET | /members/search | Постраничный поиск (OData $filter) |
GET | /members/filter | Облегчённый список профилей |
POST | /members/export | Экспорт базы гостей |
GET | /members/{memberId}/visits | История визитов |
GET | /members/{memberId}/inprogress | Текущие (активные) визиты |
GET | /members/{memberId}/upcomingvisits | Предстоящие визиты |
GET | /customer/{memberId} | Карточка гостя |
GET | /guest/{memberId}/details | Детали гостя |
Профиль гостя (CustomerContract)
Большинство эндпоинтов чтения возвращают объект CustomerContract — полную карточку гостя. Ниже — ключевые поля. Поля только для чтения (агрегаты, счётчики визитов) рассчитываются системой и при создании/обновлении игнорируются.
Идентификация и контакты
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор гостя |
fullName | string | Полное имя гостя |
lastName | string | Фамилия |
phoneNumber | string | Телефон |
officePhone | string | Рабочий телефон |
email | string | |
language | string | Язык общения |
gender | string | Пол |
companyName | string | Компания |
officeAddress | string | Рабочий адрес |
source | string | Источник появления гостя в базе |
image | string | URL аватара |
externalUserId | string | Внешний ID гостя на вашей стороне |
Предпочтения и признаки
| Поле | Тип | Описание |
|---|---|---|
vip | boolean | VIP-гость |
vegetarian | boolean | Вегетарианец |
handicapAccessible | boolean | Нужен безбарьерный доступ |
allergy | array<string> | Список аллергий |
tablePreferences | string | Предпочтения по столу/посадке |
aboutGuestNotes | string | Заметки о госте |
isBlacklisted | boolean | В чёрном списке |
isMarketingOptOut | boolean | Отказ от маркетинговых рассылок |
guestTags | array<TagContract> | Теги гостя: id, name, color |
Важные даты
| Поле | Тип | Описание |
|---|---|---|
birthdate | date-time | Дата рождения |
birthDay / birthMonth | integer | День / месяц рождения (для напоминаний) |
anniversary | date-time | Годовщина |
anniversaryDay / anniversaryMonth | integer | День / месяц годовщины |
joinDate | date-time | Дата добавления в базу |
Статистика гостя (только чтение)
| Поле | Тип | Описание |
|---|---|---|
status | string | Статус гостя |
numberOfVisitsTotal | integer | Всего визитов |
numberOfVisits30Days | integer | Визитов за 30 дней |
cancelCount | integer | Отмен |
noShowCount | integer | Неявок (no-show) |
averageCheque | number | Средний чек |
totalSpent | number | Суммарно потрачено |
lastVisitDate | date-time | Последний визит |
numberOfReservesTotal | integer | Всего броней |
numberOfReservesOnline | integer | Броней онлайн |
numberOfReservesHost | integer | Броней через хоста |
upcomingVisits | integer | Предстоящих визитов |
Вложенные объекты
| Поле | Объект | Содержит |
|---|---|---|
deliveryAddressFull | Address | Адрес доставки: addressString, city, state, country, zip, street, building, apartment, coordinates (lat/lng), formattedAddress, timeZoneId |
linkedRestaurants | array<RestaurantSlim> | Связанные рестораны сети: id, name, type, lastVisit, lastTotalSpent |
GET /members — список гостей
Возвращает гостей ресторана с поддержкой OData-фильтрации, сортировки и постраничного вывода.
Параметры
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
$top | query | integer | Сколько записей вернуть |
$skip | query | integer | Сколько записей пропустить |
$orderby | query | string | Поле сортировки (OData) |
$filter | query | string | Условие фильтрации (OData) |
fromDate | query | date-time | Начало периода (по дате визита/добавления) |
toDate | query | date-time | Конец периода |
$eventIds | query | string | Фильтр по идентификаторам событий |
Пример
curl -G https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members \ -H "Authorization: Bearer $TOKEN" \ --data-urlencode '$top=50' \ --data-urlencode '$orderby=lastVisitDate desc'
Точная схема успешного ответа (200) в спецификации не зафиксирована. По смыслу эндпоинт возвращает коллекцию гостей (
CustomerContract); для постраничного варианта с общим количеством используйтеGET /members/search.
POST /members — создать гостя
Создаёт нового гостя в базе ресторана. Тело — CustomerUpdateContract.
Поля тела
| Поле | Тип | Описание |
|---|---|---|
fullName | string | Полное имя |
phoneNumber | string | Телефон |
email | string | |
language | string | Язык общения |
gender | string | Пол |
aboutGuestNotes | string | Заметки о госте |
tablePreferences | string | Предпочтения по столу |
allergy | array<string> | Аллергии |
anniversary | date-time | Годовщина |
birthdate | date-time | Дата рождения |
companyName | string | Компания |
officeAddress | string | Рабочий адрес |
officePhone | string | Рабочий телефон |
vip | boolean | VIP-гость |
vegetarian | boolean | Вегетарианец |
handicapAccessible | boolean | Безбарьерный доступ |
isBlacklisted | boolean | В чёрном списке |
isMarketingOptOut | boolean | Отказ от рассылок |
guestTags | array<TagContract> | Теги: id, name, color |
base64DataUrl | string | Аватар в виде data-URL (base64) |
Пример
curl -X POST https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"fullName": "Иван Петров",
"phoneNumber": "+79991234567",
"email": "ivan@example.com",
"vip": true,
"vegetarian": false,
"allergy": ["орехи"],
"tablePreferences": "Столик у окна",
"guestTags": [{ "name": "Постоянный", "color": "#DD7352" }]
}'
Ответ. При успехе —
201 Createdс созданным гостем (CustomerContract). Документированные ошибки: тело —ProblemDetails(см. Ошибки).
GET /members/{memberId} — получить гостя
Возвращает гостя по идентификатору.
| Параметр | Где | Тип |
|---|---|---|
restaurantId * | path | integer |
memberId * | path | string |
PUT /members/{memberId} — обновить гостя
Обновляет профиль гостя. Тело — тот же CustomerUpdateContract, что и при создании; присылайте изменяемые поля.
| Параметр | Где | Тип |
|---|---|---|
restaurantId * | path | integer |
memberId * | path | integer |
curl -X PUT https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/456 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "aboutGuestNotes": "Любит столик у окна", "vip": true }'
DELETE /members/{memberId} — удалить гостя
Удаляет гостя из базы ресторана.
| Параметр | Где | Тип |
|---|---|---|
restaurantId * | path | string |
memberId * | path | integer |
curl -X DELETE https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/456 \ -H "Authorization: Bearer $TOKEN"
GET /members/find — найти по телефону
Ищет гостя по номеру телефона — удобно перед созданием, чтобы не плодить дубли.
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
phoneNumber | query | string | Номер телефона для поиска |
curl -G https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/find \ -H "Authorization: Bearer $TOKEN" \ --data-urlencode "phoneNumber=+79991234567"
GET /members/email/{email} — найти по email
Ищет гостя по адресу электронной почты.
| Параметр | Где | Тип |
|---|---|---|
restaurantId * | path | string |
email * | path | string |
curl https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/email/ivan@example.com \ -H "Authorization: Bearer $TOKEN"
GET /members/search — постраничный поиск
Постраничный поиск гостей с OData-фильтром и токеном продолжения. Возвращает PagedResult с массивом полных профилей и общим количеством.
Параметры
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
$filter | query | string | Условие фильтрации (OData) |
take | query | integer | Размер страницы |
skip | query | integer | Смещение |
token | query | string | Токен продолжения для следующей страницы |
Ответ (PagedResult<CustomerContract>)
| Поле | Тип | Описание |
|---|---|---|
results | array<CustomerContract> | Найденные гости (см. структуру выше) |
count | integer | Общее количество совпадений |
curl -G https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/search \ -H "Authorization: Bearer $TOKEN" \ --data-urlencode '$filter=contains(fullName,'"'"'Иван'"'"')' \ --data-urlencode 'take=25'
GET /members/filter — облегчённый список профилей
Возвращает упрощённые карточки гостей (CustomerProfileContract) — полезно для списков и автодополнения, где не нужна вся статистика.
Параметры
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
take | query | integer | Размер страницы |
token | query | string | Токен продолжения |
Ответ — массив CustomerProfileContract
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор гостя |
customerName | string | Имя |
phone | string | Телефон |
visitsCount | integer | Количество визитов |
status | string | Статус |
vendorName | string | Вендор |
lastVisitDate | date-time | Последний визит |
isBlacklisted | boolean | В чёрном списке |
guestTags | array<TagContract> | Теги: id, name, color |
POST /members/export — экспорт базы гостей
Запускает экспорт списка гостей (например, в файл/выгрузку). Тело — ExportInfoCustomersContract.
| Поле | Тип | Описание |
|---|---|---|
filter | string | Условие фильтрации (OData), какой срез базы выгрузить |
curl -X POST https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/export \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "filter": "vip eq true" }'
Ответ.
201 Created— экспорт принят в обработку.
История визитов
Три эндпоинта возвращают визиты гостя в разных срезах. Все принимают необязательный restaurantIds — чтобы агрегировать историю по нескольким ресторанам сети.
GET /members/{memberId}/visits — прошлые визиты
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
memberId * | path | integer | Идентификатор гостя |
take | query | integer | Размер страницы |
skip | query | integer | Смещение |
orderBy | query | string | Поле сортировки |
restaurantIds | query | array<integer> | Учитывать визиты в этих ресторанах |
GET /members/{memberId}/inprogress — текущие визиты
Визиты, которые идут прямо сейчас (гость за столом).
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
memberId * | path | integer | Идентификатор гостя |
restaurantIds | query | array<integer> | Список ресторанов |
GET /members/{memberId}/upcomingvisits — предстоящие визиты
Будущие брони гостя.
| Параметр | Где | Тип | Описание |
|---|---|---|---|
restaurantId * | path | integer | Идентификатор ресторана |
memberId * | path | string | Идентификатор гостя |
restaurantIds | query | array<integer> | Список ресторанов |
curl -G https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/456/visits \ -H "Authorization: Bearer $TOKEN" \ --data-urlencode "take=20" \ --data-urlencode "orderBy=date desc"
Карточка гостя
GET /customer/{memberId} — карточка гостя
Возвращает карточку гостя по идентификатору.
| Параметр | Где | Тип |
|---|---|---|
restaurantId * | path | integer |
memberId * | path | string |
GET /guest/{memberId}/details — детали гостя
Возвращает детальную информацию о госте.
| Параметр | Где | Тип |
|---|---|---|
restaurantId * | path | integer |
memberId * | path | string |
curl https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/customer/ABC_ID \ -H "Authorization: Bearer $TOKEN"
Точные схемы ответов карточки и деталей гостя в спецификации не зафиксированы — по смыслу возвращается профиль гостя с агрегированной статистикой (близко к
CustomerContract).