Подготовьте действующую публикацию
Уполномоченный сотрудник ресторана создаёт черновик бренда или заведения, публикует проверенную ревизию, включает подключение HOSTED и подтверждает необходимые полномочия домена. Бренд принадлежит одной организации; точка — реальное заведение, явно подключённое к этому соединению. Черновик, отключённое подключение или непроверенный домен не являются публичной публикацией.
Административная настройка и учётные данные провайдеров остаются в защищённой рабочей зоне Hallify. Публичные методы чтения не создают черновики, не публикуют контент, не подтверждают домен и не включают подключение. Документация не создаёт ресторан, одноразовое тестовое заведение или доступ к развёртыванию.
Маршруты кабинета: /venues/:venueId/settings/storefront для настройки заведения и /organizations/:organizationId/storefront для настройки бренда. Доступ к разделу заведения проверяется правилом Hallify venueSettings; настройка бренда организации требует organization.manage. Выберите действующую организацию или заведение в своём разрешённом рабочем пространстве Hallify.
Получите опубликованное представление
Используйте опубликованный publicHandle подключения. Общая hosted-страница открывается по /s/{publicHandle}, выбранная точка — по /s/{publicHandle}/venues/{venueId}. Публичные REST-запросы идут на https://api.hallify.co. Для чтения не нужны cookie аккаунта или общий ключ ресторана; оно не предоставляет полномочий для гостевых транзакций.
Пример содержит вымышленные данные и не отправляет запрос со страницы документации. В собственном браузерном приложении используйте credentials: 'omit'. При генерации транспортных типов из скачанного публичного OpenAPI используйте StorefrontPublicPresentationDto, не создавая параллельный контракт представления.
- Получите настоящий опубликованный handle у уполномоченного сотрудника; не выводите его из идентификатора организации или заведения.
- Прочитайте представление по handle и проверьте HTTP-статус перед использованием типизированного документа, сведений о публикации и канонического URL.
- Для бренда получите ограниченную страницу точек с limit от 1 до 50. Используйте возвращённый nextCursor до значения null; не создавайте курсор самостоятельно и не переносите его между брендами.
- Выберите одно из возвращённых реальных заведений и прочитайте представление выбранной точки. Сохраняйте её валюту и часовой пояс в последующем гостевом процессе соответствующего домена.
const publicHandle = 'demo-restaurant';
const url = new URL(
`/public/storefronts/${encodeURIComponent(publicHandle)}`,
'https://api.hallify.co'
);
const response = await fetch(url, { credentials: 'omit' });
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const presentation = await response.json();
const representationEtag = response.headers.get('ETag');Используйте нативный locator заказа выбранной точки
Выбранное представление и каждая точка каталога могут содержать nullable ordering discovery. У бренда без выбранного заведения ordering отсутствует; null означает недоступный заказ, а не разрешение угадать канал. Непустая запись возвращает точные connectionId, привязанный PREORDER resourceId, venueId, publicChannelId и publicChannelHandle. Handle нативного канала отличается от handle представления витрины.
Сохраняйте locator при открытии нативного каталога и draft flow; не объединяйте точки, валюты и tenant-контекст. При выдаче черновика передавайте его connectionId в объявленном несекретном x-hallify-connection-id, в том числе на каноническом Origin Hallify. Сервер определяет и фиксирует точную текущую нативную привязку; не придумывайте поля тела для остальных значений locator и не меняйте привязку последующих приватных вызовов.
allowedOrigins каталога и активные нативные политики исполнения остаются отдельными полномочиями. Привязанный канал или успешное публичное чтение Storefront не допускают ваш origin автоматически и не подтверждают готовность ASAP/планового заказа. Прочитайте фактические каталог и fulfillmentOptions, затем пройдите корзину, проверку, зафиксированный quote и исходное управление. Ошибка проекции не разрешает подмену канала; STOREFRONT_ORDERING_UNAVAILABLE обозначает недоступную scoped discovery.
Используйте нативный локатор бронирования выбранного заведения
Выбранное представление и каждое заведение списка могут содержать nullable reservations discovery. У бренда без выбранного заведения reservations: null. Непустая запись содержит ровно connectionId, resourceId прикреплённого RESERVATION, venueId, publicChannelId и publicChannelHandle. Нативный handle бронирования отличается от handle представления; прикреплённые MENU или канал предзаказа не создают прав бронирования.
Следуйте точному нативному каналу к конфигурации, доступности, предложению гарантии, намерению и проверке контакта. Передавайте его connectionId как объявленный несекретный x-hallify-connection-id при разрешении нативного канала, в том числе на каноническом Origin. Сохраняйте фактический Origin браузера и исходную привязку presentation; не придумывайте поля тела для остальных discovery-значений и не объединяйте заведения. Статус канала, разрешённые origin, вместимость и реальная проверка контакта остаются нативными правилами.
Null отключает обнаружение бронирования и не разрешает угаданный handle, canonical fallback или скопированный manage-доступ. STOREFRONT_RESERVATIONS_UNAVAILABLE означает невозможность безопасной проекции бронирования в текущем scope. Успешное чтение Storefront не создаёт удержание, бронь, запись ожидания, согласие на гарантию или платёжный доступ. Продолжайте приватное управление и checkout гарантии только с собственными выданными нативными правами.
Hosted-бронирование использует /s/{publicHandle}/venues/{venueId}/book на общем хосте Hallify и /venues/{venueId}/book на проверенном собственном хосте. WIDGET использует изолированный frame /widgets/:connectionId с точным проверенным parent binding и приватным bootstrap. Нативный поиск resource/channel сохраняет силу.
Повторно проверяйте контент и подтверждённые домены
Публикация сохраняет неизменные идентификатор, исходную ревизию, версию схемы и хеш контента. Публичные поля профиля заведения остаются актуальными. ETag представления и политика public, max-age=0, must-revalidate требуют повторной проверки; опубликованный документ не означает бессрочных полномочий. При совпадении If-None-Match чтение по handle возвращает 304 без тела: используйте только ранее сохранённое представление той же публичной области.
Поиск по домену сопоставляет нормализованное имя с одним действующим проверенным hosted-подключением. Ответ содержит текущее представление и, когда применимо, проверенный канонический адрес. Имя домена служит для поиска. Оно не предоставляет доступ к бронированию, заказу, участию в сессии стола или платежу и не заменяет несвязанный публичный handle. Неизвестные или утратившие полномочия домены отклоняются.
На собственном hosted-домене представление открывается по /, а подключённая точка — по /venues/{venueId}. Runtime определяет фактический доверенный host запроса; переданное клиентом имя домена или подмена forwarded-host не выбирают организацию. Снятие публикации или отключение одного hosted-подключения само по себе не разрешает менять исходный канал заказов или другое подключение.
Границы текущей реализации
Документ представления поддерживает проверенный типизированный контент и безопасные токены темы, а ресторанный контент — английский, грузинский и русский языки. Произвольные HTML, CSS и скрипты не принимаются. Опубликованное представление не является доступным для заказа меню, гостевой оплатой или общим счётом.
Нативные заказы, бронирования и платежи сохраняют отдельные ресурсные и финансовые права. Виджеты добавляют proof проверенного parent/frame без объединения нативных доступов. JS/TS SDK раскрывает только выбранные канонические операции. Курьерская диспетчеризация, npm publication и live browser/domain/provider квалификации остаются отдельными.
Изменение DNS клиента, подключение домена к провайдеру развёртывания, сертификаты и приёмка действующего домена требуют фактической операционной настройки и проверки. Сохранённая привязка домена или исходный код не подтверждают активацию production-домена провайдером.