Hostme | Гостевая книга

Гостевая книга

Обновлено: 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 — полную карточку гостя. Ниже — ключевые поля. Поля только для чтения (агрегаты, счётчики визитов) рассчитываются системой и при создании/обновлении игнорируются.

Идентификация и контакты

ПолеТипОписание
idstringИдентификатор гостя
fullNamestringПолное имя гостя
lastNamestringФамилия
phoneNumberstringТелефон
officePhonestringРабочий телефон
emailstringEmail
languagestringЯзык общения
genderstringПол
companyNamestringКомпания
officeAddressstringРабочий адрес
sourcestringИсточник появления гостя в базе
imagestringURL аватара
externalUserIdstringВнешний ID гостя на вашей стороне

Предпочтения и признаки

ПолеТипОписание
vipbooleanVIP-гость
vegetarianbooleanВегетарианец
handicapAccessiblebooleanНужен безбарьерный доступ
allergyarray<string>Список аллергий
tablePreferencesstringПредпочтения по столу/посадке
aboutGuestNotesstringЗаметки о госте
isBlacklistedbooleanВ чёрном списке
isMarketingOptOutbooleanОтказ от маркетинговых рассылок
guestTagsarray<TagContract>Теги гостя: id, name, color

Важные даты

ПолеТипОписание
birthdatedate-timeДата рождения
birthDay / birthMonthintegerДень / месяц рождения (для напоминаний)
anniversarydate-timeГодовщина
anniversaryDay / anniversaryMonthintegerДень / месяц годовщины
joinDatedate-timeДата добавления в базу

Статистика гостя (только чтение)

ПолеТипОписание
statusstringСтатус гостя
numberOfVisitsTotalintegerВсего визитов
numberOfVisits30DaysintegerВизитов за 30 дней
cancelCountintegerОтмен
noShowCountintegerНеявок (no-show)
averageChequenumberСредний чек
totalSpentnumberСуммарно потрачено
lastVisitDatedate-timeПоследний визит
numberOfReservesTotalintegerВсего броней
numberOfReservesOnlineintegerБроней онлайн
numberOfReservesHostintegerБроней через хоста
upcomingVisitsintegerПредстоящих визитов

Вложенные объекты

ПолеОбъектСодержит
deliveryAddressFullAddressАдрес доставки: addressString, city, state, country, zip, street, building, apartment, coordinates (lat/lng), formattedAddress, timeZoneId
linkedRestaurantsarray<RestaurantSlim>Связанные рестораны сети: id, name, type, lastVisit, lastTotalSpent

GET /members — список гостей

Возвращает гостей ресторана с поддержкой OData-фильтрации, сортировки и постраничного вывода.

Параметры

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
$topqueryintegerСколько записей вернуть
$skipqueryintegerСколько записей пропустить
$orderbyquerystringПоле сортировки (OData)
$filterquerystringУсловие фильтрации (OData)
fromDatequerydate-timeНачало периода (по дате визита/добавления)
toDatequerydate-timeКонец периода
$eventIdsquerystringФильтр по идентификаторам событий

Пример

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.

Поля тела

ПолеТипОписание
fullNamestringПолное имя
phoneNumberstringТелефон
emailstringEmail
languagestringЯзык общения
genderstringПол
aboutGuestNotesstringЗаметки о госте
tablePreferencesstringПредпочтения по столу
allergyarray<string>Аллергии
anniversarydate-timeГодовщина
birthdatedate-timeДата рождения
companyNamestringКомпания
officeAddressstringРабочий адрес
officePhonestringРабочий телефон
vipbooleanVIP-гость
vegetarianbooleanВегетарианец
handicapAccessiblebooleanБезбарьерный доступ
isBlacklistedbooleanВ чёрном списке
isMarketingOptOutbooleanОтказ от рассылок
guestTagsarray<TagContract>Теги: id, name, color
base64DataUrlstringАватар в виде 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 *pathinteger
memberId *pathstring

PUT /members/{memberId} — обновить гостя

Обновляет профиль гостя. Тело — тот же CustomerUpdateContract, что и при создании; присылайте изменяемые поля.

ПараметрГдеТип
restaurantId *pathinteger
memberId *pathinteger
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 *pathstring
memberId *pathinteger
curl -X DELETE https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/456 \
  -H "Authorization: Bearer $TOKEN"

GET /members/find — найти по телефону

Ищет гостя по номеру телефона — удобно перед созданием, чтобы не плодить дубли.

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
phoneNumberquerystringНомер телефона для поиска
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 *pathstring
email *pathstring
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 *pathintegerИдентификатор ресторана
$filterquerystringУсловие фильтрации (OData)
takequeryintegerРазмер страницы
skipqueryintegerСмещение
tokenquerystringТокен продолжения для следующей страницы

Ответ (PagedResult<CustomerContract>)

ПолеТипОписание
resultsarray<CustomerContract>Найденные гости (см. структуру выше)
countintegerОбщее количество совпадений
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 *pathintegerИдентификатор ресторана
takequeryintegerРазмер страницы
tokenquerystringТокен продолжения

Ответ — массив CustomerProfileContract

ПолеТипОписание
idstringИдентификатор гостя
customerNamestringИмя
phonestringТелефон
visitsCountintegerКоличество визитов
statusstringСтатус
vendorNamestringВендор
lastVisitDatedate-timeПоследний визит
isBlacklistedbooleanВ чёрном списке
guestTagsarray<TagContract>Теги: id, name, color

POST /members/export — экспорт базы гостей

Запускает экспорт списка гостей (например, в файл/выгрузку). Тело — ExportInfoCustomersContract.

ПолеТипОписание
filterstringУсловие фильтрации (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 *pathintegerИдентификатор ресторана
memberId *pathintegerИдентификатор гостя
takequeryintegerРазмер страницы
skipqueryintegerСмещение
orderByquerystringПоле сортировки
restaurantIdsqueryarray<integer>Учитывать визиты в этих ресторанах

GET /members/{memberId}/inprogress — текущие визиты

Визиты, которые идут прямо сейчас (гость за столом).

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
memberId *pathintegerИдентификатор гостя
restaurantIdsqueryarray<integer>Список ресторанов

GET /members/{memberId}/upcomingvisits — предстоящие визиты

Будущие брони гостя.

ПараметрГдеТипОписание
restaurantId *pathintegerИдентификатор ресторана
memberId *pathstringИдентификатор гостя
restaurantIdsqueryarray<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 *pathinteger
memberId *pathstring

GET /guest/{memberId}/details — детали гостя

Возвращает детальную информацию о госте.

ПараметрГдеТип
restaurantId *pathinteger
memberId *pathstring
curl https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/customer/ABC_ID \
  -H "Authorization: Bearer $TOKEN"

Точные схемы ответов карточки и деталей гостя в спецификации не зафиксированы — по смыслу возвращается профиль гостя с агрегированной статистикой (близко к CustomerContract).