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
- В личном кабинете Restoplace перейдите в нужный адрес заведения и откройте настройки адреса.
- В левом меню раскройте пункт «Интеграции».
- Перейдите в раздел «API / Webhook».
- Включите тумблер «Включить Webhook».
- Вставьте ваш HTTPS-endpoint в поле (URL вебхука).
- Включите нужные типы событий:
- «Отправлять события резервов»;
- «Отправлять события билетов»;
- «Отправлять события сертификатов».
- Нажмите «Сохранить».

Общие принципы работы
- 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‑событием.
Частичное использование сертификатов
- Остаток =
paymentPriceTotal−paymentUsed; - История использования может передаваться в
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), советы по обработке