Partner API
Oct 27, 2026 1:07 AM

Guest Book

Working with the restaurant's guest base: listing and search, creating and editing profiles, tags and visit history.

Working with the restaurant’s guest base: listing, search, creating and editing profiles, the guest card with visit history. Through these endpoints a partner app (CRM, POS, marketing service) can sync its customer base, enrich profiles with guest preferences and retrieve their visit history.

All endpoints require a Bearer token (see Authentication). General request conventions and the error format are covered in Conventions and Errors.

Base path: /api/loyalty/admin/restaurants/{restaurantId}/....

Historically the guest base is served under the /api/loyalty/... prefix, and the entity in the API is called member. In this documentation it is simply a guest — with no tie to a loyalty program.

MethodPathPurpose
GET/membersList guests (OData filters)
POST/membersCreate a guest
GET/members/{memberId}Get a guest by ID
PUT/members/{memberId}Update a guest
DELETE/members/{memberId}Delete a guest
GET/members/findFind by phone number
GET/members/email/{email}Find by email
GET/members/searchPaged search (OData $filter)
GET/members/filterLightweight profile list
POST/members/exportExport the guest base
GET/members/{memberId}/visitsVisit history
GET/members/{memberId}/inprogressCurrent (active) visits
GET/members/{memberId}/upcomingvisitsUpcoming visits
GET/customer/{memberId}Guest card
GET/guest/{memberId}/detailsGuest details

Guest profile (CustomerContract)

Most read endpoints return a CustomerContract object — the full guest card. The key fields are below. Read-only fields (aggregates, visit counters) are computed by the system and ignored on create/update.

Identity and contacts

FieldTypeDescription
idstringGuest identifier
fullNamestringGuest’s full name
lastNamestringLast name
phoneNumberstringPhone
officePhonestringWork phone
emailstringEmail
languagestringPreferred language
genderstringGender
companyNamestringCompany
officeAddressstringWork address
sourcestringWhere the guest came into the base from
imagestringAvatar URL
externalUserIdstringThe guest’s external ID on your side

Preferences and flags

FieldTypeDescription
vipbooleanVIP guest
vegetarianbooleanVegetarian
handicapAccessiblebooleanNeeds accessible seating
allergyarray<string>List of allergies
tablePreferencesstringTable/seating preferences
aboutGuestNotesstringNotes about the guest
isBlacklistedbooleanBlacklisted
isMarketingOptOutbooleanOpted out of marketing mailings
guestTagsarray<TagContract>Guest tags: id, name, color

Important dates

FieldTypeDescription
birthdatedate-timeDate of birth
birthDay / birthMonthintegerBirth day / month (for reminders)
anniversarydate-timeAnniversary
anniversaryDay / anniversaryMonthintegerAnniversary day / month
joinDatedate-timeDate added to the base

Guest statistics (read-only)

FieldTypeDescription
statusstringGuest status
numberOfVisitsTotalintegerTotal visits
numberOfVisits30DaysintegerVisits in the last 30 days
cancelCountintegerCancellations
noShowCountintegerNo-shows
averageChequenumberAverage check
totalSpentnumberTotal spent
lastVisitDatedate-timeLast visit
numberOfReservesTotalintegerTotal reservations
numberOfReservesOnlineintegerOnline reservations
numberOfReservesHostintegerReservations made by the host
upcomingVisitsintegerUpcoming visits

Nested objects

FieldObjectContains
deliveryAddressFullAddressDelivery address: addressString, city, state, country, zip, street, building, apartment, coordinates (lat/lng), formattedAddress, timeZoneId
linkedRestaurantsarray<RestaurantSlim>Linked restaurants of the chain: id, name, type, lastVisit, lastTotalSpent

List guests

GET /members

Returns the restaurant’s guests with OData filtering, sorting and paging.

Parameters

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
$topqueryintegerHow many records to return
$skipqueryintegerHow many records to skip
$orderbyquerystringSort field (OData)
$filterquerystringFilter condition (OData)
fromDatequerydate-timePeriod start (by visit/added date)
toDatequerydate-timePeriod end
$eventIdsquerystringFilter by event identifiers

Example

Terminal window
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'

The exact schema of the successful (200) response is not captured in the spec. In practice the endpoint returns a collection of guests (CustomerContract); for a paged variant with a total count use GET /members/search.


Create a guest

POST /members

Creates a new guest in the restaurant’s base. Body — CustomerUpdateContract.

Body fields

FieldTypeDescription
fullNamestringFull name
phoneNumberstringPhone
emailstringEmail
languagestringPreferred language
genderstringGender
aboutGuestNotesstringNotes about the guest
tablePreferencesstringTable preferences
allergyarray<string>Allergies
anniversarydate-timeAnniversary
birthdatedate-timeDate of birth
companyNamestringCompany
officeAddressstringWork address
officePhonestringWork phone
vipbooleanVIP guest
vegetarianbooleanVegetarian
handicapAccessiblebooleanAccessible seating
isBlacklistedbooleanBlacklisted
isMarketingOptOutbooleanOpted out of mailings
guestTagsarray<TagContract>Tags: id, name, color
base64DataUrlstringAvatar as a data URL (base64)

Example

Terminal window
curl -X POST https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"fullName": "John Parker",
"phoneNumber": "+16175550123",
"email": "ivan@example.com",
"vip": true,
"vegetarian": false,
"allergy": ["nuts"],
"tablePreferences": "Window table",
"guestTags": [{ "name": "Regular", "color": "#DD7352" }]
}'

Response. On success — 201 Created with the created guest (CustomerContract). Documented errors: body — ProblemDetails (see Errors).


Get a guest

GET /members/{memberId}

Returns a guest by identifier.

ParameterInType
restaurantId *pathinteger
memberId *pathstring

Update a guest

PUT /members/{memberId}

Updates the guest profile. Body — the same CustomerUpdateContract as on create; send the fields you want to change.

ParameterInType
restaurantId *pathinteger
memberId *pathinteger
Terminal window
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": "Prefers a window table", "vip": true }'

Delete a guest

DELETE /members/{memberId}

Removes the guest from the restaurant’s base.

ParameterInType
restaurantId *pathstring
memberId *pathinteger
Terminal window
curl -X DELETE https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/456 \
-H "Authorization: Bearer $TOKEN"

Find by phone

GET /members/find

Looks up a guest by phone number — handy before creating one, to avoid duplicates.

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
phoneNumberquerystringPhone number to search for
Terminal window
curl -G https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/find \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "phoneNumber=+16175550123"

Find by email

GET /members/email/{email}

Looks up a guest by email address.

ParameterInType
restaurantId *pathstring
email *pathstring
Terminal window
curl https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/email/ivan@example.com \
-H "Authorization: Bearer $TOKEN"

GET /members/search

Paged guest search with an OData filter and a continuation token. Returns a PagedResult with an array of full profiles and the total count.

Parameters

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
$filterquerystringFilter condition (OData)
takequeryintegerPage size
skipqueryintegerOffset
tokenquerystringContinuation token for the next page

Response (PagedResult<CustomerContract>)

FieldTypeDescription
resultsarray<CustomerContract>Matching guests (see the structure above)
countintegerTotal number of matches
Terminal window
curl -G https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/members/search \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode '$filter=contains(fullName,'"'"'John'"'"')' \
--data-urlencode 'take=25'

Lightweight profile list

GET /members/filter

Returns simplified guest cards (CustomerProfileContract) — useful for lists and autocomplete where the full statistics aren’t needed.

Parameters

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
takequeryintegerPage size
tokenquerystringContinuation token

Response — array of CustomerProfileContract

FieldTypeDescription
idstringGuest identifier
customerNamestringName
phonestringPhone
visitsCountintegerNumber of visits
statusstringStatus
vendorNamestringVendor
lastVisitDatedate-timeLast visit
isBlacklistedbooleanBlacklisted
guestTagsarray<TagContract>Tags: id, name, color

Export the guest base

POST /members/export

Starts an export of the guest list (e.g. to a file/download). Body — ExportInfoCustomersContract.

FieldTypeDescription
filterstringFilter condition (OData) — which slice of the base to export
Terminal window
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" }'

Response. 201 Created — the export has been accepted for processing.


Visit history

Three endpoints return a guest’s visits in different slices. All accept an optional restaurantIds — to aggregate history across several restaurants of a chain.

Past visits

GET /members/{memberId}/visits

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
memberId *pathintegerGuest identifier
takequeryintegerPage size
skipqueryintegerOffset
orderByquerystringSort field
restaurantIdsqueryarray<integer>Include visits to these restaurants

Current visits

GET /members/{memberId}/inprogress

Visits happening right now (the guest is seated).

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
memberId *pathintegerGuest identifier
restaurantIdsqueryarray<integer>List of restaurants

Upcoming visits

GET /members/{memberId}/upcomingvisits

The guest’s future reservations.

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
memberId *pathstringGuest identifier
restaurantIdsqueryarray<integer>List of restaurants
Terminal window
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"

Guest card

Guest card

GET /customer/{memberId}

Returns the guest card by identifier.

ParameterInType
restaurantId *pathinteger
memberId *pathstring

Guest details

GET /guest/{memberId}/details

Returns detailed information about the guest.

ParameterInType
restaurantId *pathinteger
memberId *pathstring
Terminal window
curl https://api.hostmeapp.com/api/loyalty/admin/restaurants/123/customer/ABC_ID \
-H "Authorization: Bearer $TOKEN"

The exact response schemas for the guest card and guest details are not captured in the spec — in practice a guest profile with aggregated statistics is returned (close to CustomerContract).