Перейти к основному содержимому

Webhook событий — Restoplace

Эта инструкция для разработчиков и описывает формат webhook‑событий о создании и обновлении:

  • резервов (reserve.*);
  • билетов (ticket.*);
  • подарочных сертификатов (certificate.*).

Используйте webhook, чтобы:

  • принимать данные в свою CRM/ERP;
  • запускать автоматизации;
  • синхронизировать статусы между системами.

Для уведомлений гостей по шаблонам используйте отдельный webhook уведомлений.

Типы webhook‑событий

В Restoplace поддерживаются следующие типы событий:

Резервы

  • reserve.created — создан новый резерв;
  • reserve.updated — в резерве произошли изменения.

Билеты

  • ticket.created — создан новый билет на событие;
  • ticket.updated — в билете произошли изменения.

Сертификаты

  • certificate.created — создан новый подарочный сертификат;
  • certificate.updated — в сертификате произошли изменения.

Где включить Webhook

  1. В личном кабинете Restoplace перейдите в нужный адрес заведения и откройте настройки адреса.
  2. В левом меню раскройте пункт «Интеграции».
  3. Перейдите в раздел «API / Webhook».
  4. Включите тумблер «Включить Webhook».
  5. Вставьте ваш HTTPS-endpoint в поле (URL вебхука).
  6. Включите нужные типы событий:
    • «Отправлять события резервов»;
    • «Отправлять события билетов»;
    • «Отправлять события сертификатов».
  7. Нажмите «Сохранить».

Где включить webhook Restoplace

Общие принципы работы

  • Restoplace отправляет HTTP‑запрос POST с телом в формате JSON.
  • В поле event указывается тип события: reserve.created, ticket.updated, certificate.created и т.д.
  • Рекомендуется обрабатывать события идемпотентно:
    • использовать id и/или бизнес‑идентификаторы (reserve_id, ticket_id, number);
    • вместе с last_updated, чтобы применять только самые свежие изменения.
  • Endpoint должен принимать только HTTPS.
  • На успешную обработку события рекомендуется отвечать кодом 200 OK.

🎯 Webhook событий резервов

Что и когда отправляется

Restoplace отправляет webhook при следующих событиях:

  • reserve.created — создан новый резерв (бронь);
  • reserve.updated — в резерве произошли изменения (статус, депозит, объект бронирования, сумма заказа и т.п.).

Структура JSON и поля

Ниже перечислены поля, которые приходят в webhook‑событии для резервов. Названия и типы следует соблюдать строго — используйте их для сериализации и валидации на вашей стороне.

Общие поля

  • event (string) — тип события (reserve.created, reserve.updated);
  • id (int) — уникальный ID записи;
  • userid (int) — кто создал (0 — гость онлайн, 2 — iiko, 3 — r_keeper, 4 — через API, >10 — ID сотрудника);
  • created (string) — дата и время создания резерва;
  • last_updated (string) — дата и время последнего обновления;
  • reserve_id (int) — номер резерва, уникален в рамках адреса.

Время резерва

  • from (string) — дата и время начала резерва;
  • to (string) — дата и время конца резерва.

Информация о госте

  • name (string) — имя гостя;
  • count (int) — количество гостей;
  • phone (string) — телефон гостя;
  • email (string) — почта гостя;
  • tg_username (string) — Telegram‑логин (без @);
  • text (string) — комментарий.

Статус и тип

  • status (int) — статус резерва:
    • 1 — новая,
    • 2 — заявка,
    • 3 — ожидаем,
    • 4 — открыт,
    • 5 — закрыт,
    • 6 — отменён,
    • 8 — отменён, не внесён депозит;
  • success (boolean) — резерв подтверждён (выбран стол или зал);
  • is_fast (boolean) — тип бронирования (0 — заранее, 1 — гость пришёл по факту);
  • source (string) — источник резерва.

Метки и параметры

  • tags (array) — массив ключей меток (актуальный список — через GET /tags);
  • getparams (array/object) — GET‑параметры, указанные при бронировании в виджете (UTM-метки, roistat и т.п.).

Депозит

  • depositPriceDesired (float) — необходимый депозит для выбранного объекта бронирования;
  • depositPrice (float) — фактическая внесённая сумма депозита;
  • depositPaid (int) — подтверждение внесения депозита (0 — не внесён, 1 — внесён, 2 — оплата не прошла);
  • depositOnline (int) — депозит внесён онлайн через интернет‑эквайринг (0/1).

Сумма заказа

  • order_sum (float) — итоговая сумма заказа (если подключены интеграции с iiko или r_keeper, передаётся при закрытии счёта).

Объекты бронирования

  • item_ids (array) — список ID объектов бронирования (если это групповая бронь);
  • item_type (string) — тип объекта (group, hall, table, igloo, computer, room, ...):
    • group — забронировано несколько объектов или весь зал;
    • hall — забронирован банкетный зал;
  • floor_id (string) — ID забронированного зала;
  • floor_name (string) — название зала.

Действия

  • time_see (string) — время просмотра резерва сотрудником (перевод из «Новая» в «Заявка»);
  • time_open (string) — время открытия резерва;
  • time_close (string) — время закрытия резерва;
  • time_cancel (string) — время отмены резерва;
  • cancel_reason (string) — причина отмены бронирования;
  • userid_see (int|null) — кто просмотрел резерв;
  • userid_open (int|null) — кто открыл резерв;
  • userid_close (int|null) — кто закрыл резерв;
  • userid_cancel (int|null) — кто отменил резерв.

Дополнительная информация и адрес

  • is_banquet (int) — 0 — забронированы один или несколько объектов, но не весь зал; 1 — забронирован зал полностью или банкетный зал;
  • Parent_ID (int) — резерв, из которого пересадили гостя;
  • Next_ID (int) — резерв, в который пересадили гостя;
  • address_id (int) — ID адреса;
  • address_hash (string) — хеш адреса;
  • organization_id (int) — ID заведения (бренда).

Пример JSON для резерва

{
"event": "reserve.updated",
"id": 1000000,
"userid": 1,
"created": "2025-11-27 16:36:46",
"last_updated": null,
"reserve_id": 3234,
"time_from": "2025-11-27 16:36:46",
"time_to": "2025-11-27 17:50:00",
"name": "Иван",
"count": 2,
"phone": "7919",
"email": "",
"text": "34r34r",
"status": 4,
"success": 1,
"is_fast": 1,
"source": "adminpanel",
"tags": ["vip"],
"getparams": { "utm_company": "yandex" },
"depositPriceDesired": 1430,
"depositPrice": 0,
"depositPaid": 1,
"depositOnline": 0,
"order_sum": null,
"item_ids": [1000, 1001],
"item_type": "hookahzone",
"floor_id": 58,
"floor_name": "Основной зал",
"time_see": "",
"time_open": "2025-11-27 16:36:46",
"time_close": "",
"time_cancel": "",
"cancel_reason": null,
"is_banquet": 0,
"Parent_ID": 0,
"Next_ID": 0,
"address_id": 147,
"address_hash": "99fcee43c466423523tg",
"organization_id": 100
}

🎫 Webhook событий билетов

Эта секция описывает события о создании и обновлении билетов на события в Restoplace.

Что и когда отправляется

Restoplace отправляет webhook при событиях:

  • ticket.created — создан новый билет на событие;
  • ticket.updated — в билете произошли изменения (смена статуса, оплата, возврат средств, использование и т.д.).

Структура JSON и поля

Общие поля

  • event (string) — тип события (ticket.created, ticket.updated);
  • id (int) — уникальный ID билета;
  • userid (int) — кто создал (0 — гость онлайн, >10 — ID сотрудника);
  • created (string) — дата и время создания билета;
  • last_updated (string) — дата и время последнего обновления;
  • ticket_id (int) — номер билета, уникален в рамках адреса;
  • event_id (int) — ID события;
  • event_name (string) — название события.

Время события

  • time_from (string) — дата и время начала события;
  • time_to (string) — дата и время конца события.

Информация о госте

  • name (string) — имя гостя;
  • phone (string) — телефон гостя;
  • email (string) — почта гостя;
  • text (string) — комментарий.

Статус и тип

  • status (int) — статус билета:
    • 1 — ожидает подтверждения;
    • 2 — подтверждён;
    • 5 — использован;
    • 6 — отменён;
    • 8 — не оплачен;
  • source (string) — источник билета (widget, adminpanel, api).

Метки и параметры

  • getparams (object) — GET‑параметры из виджета (UTM-метки, roistat и т.п.).

Оплата

  • paymentPriceDesired (float) — требуемая сумма оплаты (стоимость за 1 билет);
  • paymentTotal (float) — общая сумма оплаты (за выбранное количество билетов);
  • paymentPrice (float) — конечная сумма к оплате (с учётом скидок/промокодов);
  • paymentPaid (int) — статус оплаты:
    • 0 — не оплачен;
    • 1 — оплачен;
    • 2 — оплата отменена;
    • 3 — ошибка оплаты;
  • paymentOnline (int) — оплачен онлайн через интернет‑эквайринг (0/1);
  • paymentRefund (float) — сумма возврата.

Действия

  • time_open (string) — время активации билета (перевод в статус «открыт»);
  • time_close (string) — время использования билета (перевод в статус «закрыт»);
  • time_cancel (string) — время отмены билета;
  • cancel_reason (string) — причина отмены билета;
  • userid_open (int|null) — кто открыл билет;
  • userid_close (int|null) — кто закрыл билет;
  • userid_cancel (int|null) — кто отменил билет.

Дополнительная информация и адрес

  • Parent_ID (int) — заменён с другого билета (ID исходного билета);
  • Next_ID (int) — заменён в другой билет (ID нового билета);
  • info (object) — дополнительная информация (история оплат и т.п.);
  • currency (int) — код валюты;
  • address_id (int) — ID адреса;
  • address_hash (string) — хеш адреса;
  • organization_id (int) — ID заведения (бренда).

Пример JSON для билета

{
"event": "ticket.created",
"id": 12345,
"ticket_id": 100,
"event_id": 5,
"event_name": "Гастро-ужин по мотивам зимы",
"created": "2025-01-22 18:30:00",
"last_updated": "2025-01-22 18:30:00",
"time_from": "2025-01-25 20:00:00",
"time_to": "2025-01-25 23:00:00",
"name": "Иван Петров",
"phone": "79191234567",
"email": "ivan@example.com",
"text": "Столик у сцены",
"status": 2,
"source": "widget",
"getparams": {
"utm_source": "instagram",
"utm_campaign": "newyear"
},
"paymentPriceDesired": 2000,
"paymentPrice": 1800,
"paymentTotal": 2000,
"paymentPaid": 1,
"paymentOnline": 1,
"paymentRefund": 0,
"time_open": null,
"time_close": null,
"time_cancel": null,
"cancel_reason": null,
"Parent_ID": 0,
"Next_ID": 0,
"info": {
"paid": [
{
"date": "2025-01-22 18:35:00",
"who": "online",
"price": 1800
}
]
},
"currency": 643,
"address_id": 147,
"address_hash": "99fcee43c466423523tg",
"organization_id": 100
}

🔖 Webhook событий сертификатов

Эта секция описывает события о создании и обновлении подарочных сертификатов.

Что и когда отправляется

Restoplace отправляет webhook при событиях:

  • certificate.created — создан новый сертификат;
  • certificate.updated — в сертификате произошли изменения (изменение статуса, оплата, частичное или полное использование, возврат средств и т.п.).

Структура JSON и поля

Общие поля

  • event (string) — тип события (certificate.created, certificate.updated);
  • id (int) — уникальный ID сертификата;
  • userid (int) — кто создал (0 — гость онлайн, >10 — ID сотрудника);
  • created (string) — дата и время создания;
  • last_updated (string) — дата и время последнего обновления.

Идентификаторы сертификата

  • number (string) — номер купленного сертификата;
  • guid (string) — уникальный GUID купленного сертификата;
  • certificate_id (int) — ID продаваемого сертификата;
  • certificate_name (int или string) — название продаваемого сертификата.

Срок действия

  • start (string) — дата начала действия сертификата;
  • end (string) — дата окончания действия.

Информация о покупателе

  • name (string) — имя владельца сертификата;
  • phone (string) — телефон;
  • email (string) — почта;
  • text (string) — комментарий.

Статус и тип

  • status (int) — статус сертификата:
    • 1 — ожидает оплаты,
    • 2 — активен,
    • 5 — использован,
    • 6 — отменён,
    • 8 — не оплачен;
  • source (string) — источник сертификата (widget, adminpanel, api).

Метки и параметры

  • getparams (object) — GET‑параметры из виджета (UTM-метки, roistat и т.п.).

Оплата и использование

  • paymentPriceTotal (float) — полная стоимость сертификата;
  • paymentPrice (float) — конечная сумма к оплате;
  • paymentPaid (int) — статус оплаты (0 — не оплачен, 1 — оплачен, 2 — оплата отменена, 3 — ошибка оплаты);
  • paymentOnline (int) — оплачен онлайн через интернет‑эквайринг (0/1);
  • paymentUsed (float) — уже использованная сумма сертификата;
  • paymentRefund (float) — сумма возврата.

Действия

  • time_activate (string) — время использования/активации сертификата;
  • time_cancel (string) — время отмены сертификата;
  • userid_activate (int|null) — кто активировал/использовал сертификат;
  • userid_cancel (int|null) — кто отменил сертификат (0 — автоматически, если вышел срок, либо >10 — ID сотрудника).

Дополнительная информация и адрес

  • info (object) — дополнительная информация (история оплат и использования);
  • currency (int) — код валюты;
  • address_id (int) — ID адреса;
  • address_hash (string) — хеш адреса;
  • organization_id (int) — ID заведения (бренда).

Пример JSON для сертификата

{
"event": "certificate.created",
"id": 5678,
"number": "123456789",
"guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"certificate_id": 3,
"certificate_name": "Подарочный сертификат на 5000 руб.",
"created": "2025-01-22 14:00:00",
"last_updated": "2025-01-22 14:00:00",
"start": "2025-01-22 00:00:00",
"end": "2025-07-22 23:59:59",
"name": "Мария Иванова",
"phone": "79031234567",
"email": "maria@example.com",
"text": "Подарок на день рождения",
"status": 2,
"source": "widget",
"getparams": {
"utm_source": "vk"
},
"paymentPrice": 5000,
"paymentPriceTotal": 5000,
"paymentPaid": 1,
"paymentOnline": 1,
"paymentUsed": 0,
"paymentRefund": 0,
"time_activate": null,
"time_cancel": null,
"info": {
"paid": [
{
"date": "2025-01-22 14:05:00",
"who": "online",
"price": 5000
}
]
},
"currency": 643,
"address_id": 147,
"address_hash": "99fcee43c466423523tg",
"organization_id": 100
}

Рекомендации по приёму и обработке

Идентификация записей

  • Резервы: используйте id и/или reserve_id вместе с last_updated;
  • Билеты: используйте id и/или ticket_id вместе с last_updated;
  • Сертификаты: используйте id и/или number вместе с last_updated.

Источники

  • Для аналитики каналов используйте поля source и блок getparams.

Групповые покупки билетов

  • При покупке нескольких билетов на одно событие каждый билет приходит отдельным webhook‑событием.

Частичное использование сертификатов

  • Остаток = paymentPriceTotalpaymentUsed;
  • История использования может передаваться в info.used (при включённой опции частичного использования).

Частые вопросы

Как понять, подтверждён ли резерв?

Смотрите поле success:

  • true — выбран конкретный стол/зал;
  • false — резерв пока не подтверждён.

Как понять, оплачен ли билет/сертификат?

Смотрите поле paymentPaid:

  • 1 — успешная оплата;
  • 0 — не оплачен;
  • 2 — оплата отменена;
  • 3 — ошибка оплаты.

Когда приходит reserve.updated / ticket.updated / certificate.updated?

При любых значимых изменениях:

  • смена статуса;
  • успешная/неуспешная оплата;
  • возврат средств;
  • использование билета/сертификата;
  • частичное использование сертификата;
  • изменение данных гостя и других полей.

Когда приходит order_sum у резервов?

Если подключены интеграции с iiko или R‑Keeper, сумма заказа передаётся при закрытии счёта.

Дополнительные материалы

API Restoplace. Инструкция для разработчиков

Инструкция по получению и изменению данных по API Restoplace: резервы, события, билеты, столы, залы, метки, слоты и депозиты

Webhook-уведомления Restoplace — инструкция по настройке и событиям (SMS/мессенджеры)

Подключите Webhook в Restoplace: куда ввести endpoint, какой JSON приходит, список action (бронирования, waitlist, билеты, сертификаты, оплатa), советы по обработке