Обзор вебхуков
Вебхуки позволяют ChatLab уведомлять ваши системы в тот самый момент, когда что-то происходит в ваших чатботах. Вместо постоянного опроса Management API или экспорта данных вручную вы регистрируете эндпоинт HTTPS, и ChatLab отправляет на него подписанный HTTP POST в режиме реального времени - когда посетитель оставляет лид, отправляет контактную форму, оценивает диалог, запрашивает оператора или когда срабатывает AI action.
Типичные сценарии использования:
- мгновенная передача новых лидов прямо в вашу CRM в секунду их захвата
- отправка уведомлений вашей команде в Slack, когда посетитель запрашивает live chat (чат с оператором)
- передача оценок диалогов и резюме в собственную систему аналитики
- мониторинг выполнения AI action и оповещение об ошибках
Доступность: вебхуки доступны начиная с плана Standard и выше (функция: Webhooks).
Где настроить: в панели администратора откройте Account settings -> Webhooks (Настройки аккаунта -> Вебхуки, рядом с разделом Management API). Вебхуки настраиваются на уровне аккаунта - один эндпоинт может получать события от всех ваших ботов или от отфильтрованного набора.
Настройка эндпоинта
- Откройте Account settings -> Webhooks и нажмите Create endpoint (Создать эндпоинт).
- Заполните форму эндпоинта:
- Name (Название) - метка для вашего удобства, например "CRM sync" или "Slack alerts".
- URL - адрес HTTPS, на который ChatLab будет отправлять события методом POST.
- Events (События) - выберите, какие типы событий должен получать этот эндпоинт (см. каталог ниже). Выбирайте только то, что действительно нужно; события с высокой частотой, такие как
ai_action.executed, могут создавать большой объем трафика. - Bot filter (Фильтр ботов) (необязательно) - ограничьте эндпоинт конкретными ботами. Оставьте пустым, чтобы получать события от всех ботов вашего аккаунта.
- Custom form filter (Фильтр кастомных форм) (необязательно) - направляет отправки одной конкретной кастомной формы на этот эндпоинт. Это сужает только событие
custom_form.submitted; все остальные события, на которые вы подписаны (лиды, запросы на контакт, диалоги, live chat, AI actions), доставляются независимо от этой настройки.
- Отправьте форму. Secret (секрет) эндпоинта отображается ровно один раз в диалоговом окне подтверждения - скопируйте его прямо сейчас и сохраните в надежном месте. Он понадобится вам для проверки подписей (см. раздел "Безопасность" ниже). Открытый текст позже получить невозможно.
У каждого эндпоинта также есть:
- Enable/disable toggle (Переключатель включения/отключения) - приостановка доставки без удаления эндпоинта. Отключенные эндпоинты молча отбрасывают события (они не ставятся в очередь на потом).
- Send sample event (Отправить тестовое событие) - отправляет подписанный тестовый запрос на ваш URL, чтобы вы могли полностью проверить свой приемник. Вы можете выбрать тип события и отредактировать тестовые значения перед отправкой, чтобы обработчик получил реалистичные данные. Тест поступает как обычная доставка с
eventType, соответствующим вашему выбору (или какwebhook.testдля простой проверки связи). - Roll secret (Обновить секрет) - генерирует новый секрет и аннулирует старый. Используйте это, если секрет мог быть скомпрометирован. Новый секрет также показывается только один раз. Обновите данные на стороне вашего приемника перед сменой секрета, иначе доставка не пройдет проверку подписи с вашей стороны.
- Delivery log (Журнал доставок) - отдельный для каждого эндпоинта список последних доставок с отметкой времени, типом события, кодом статуса HTTP, возвращенным вашим сервером, и временем ответа. Здесь видны неудачные доставки и паузы механизма circuit breaker. Журнал хранится в течение 14 дней.
Конверт события
Каждая доставка представляет собой запрос HTTP POST с заголовком Content-Type: application/json. Тело всегда содержит одинаковый конверт; объект data зависит от типа события:
{
"eventId": "9f1c1c8e-6a2b-4b9e-9d2f-3f8a1e2b4c5d",
"eventType": "lead.created",
"timestamp": "2026-08-13T14:22:31Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": { }
}
eventId- уникальный идентификатор события. Используйте его для дедупликации, если обработка должна быть идемпотентной.eventType- один из описанных ниже типов; также передается в заголовкеX-ChatLab-Event.timestamp- время возникновения события по стандарту ISO 8601 UTC.botId/botName- бот, к которому относится событие.conversationId/sessionId- контекст диалога, если применимо.
Каталог событий
lead.created
Срабатывает, когда посетитель отправляет свои контактные данные - через форму сбора лидов, пред-форму Live Chat или кастомную форму, настроенную для сбора лидов.
{
"eventId": "9f1c1c8e-6a2b-4b9e-9d2f-3f8a1e2b4c5d",
"eventType": "lead.created",
"timestamp": "2026-08-13T14:22:31Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"email": "jane.doe@example.com",
"name": "Jane Doe",
"phone": "+1 555 0123",
"source": "LEAD_COLLECTION_FORM",
"formCodeName": "lead_form",
"formName": "Lead form",
"fields": [
{"name": "email", "value": "jane.doe@example.com", "type": "email"},
{"name": "company", "value": "Acme Inc.", "type": "text"},
{"name": "topics", "value": ["Billing", "Delivery"], "type": "multichoice"},
{"name": "attachment", "value": "https://api.chatlab.com/aichat/customform/download?key=...&token=...", "type": "file"}
],
"pageUrl": "https://acme.com/pricing"
}
}
source- способ сбора контактных данных:LEAD_COLLECTION_FORM(форма сбора лидов),LIVE_CHAT_FORM(пред-форма Live Chat),CONVERSATION(AI определил данные в ходе диалога),ADMIN_DATA_UPDATEилиUPDATE_CLIENT_CONTEXT(отредактировано на стороне ChatLab). Отправка формы связи с оператором никогда не вызывает это событие - вместо этого срабатываетcontact_form.submitted.email,name,phone- контактные данные, сопоставленные с записью лида.- Когда для сбора лидов используется кастомная форма, каждое заданное в ней поле включается в массив
fieldsв порядке расположения в форме, аformCodeName/formNameидентифицируют форму. В случае стандартной формы сбора лидов оба этих поля равныnull, аfieldsпредставляет собой пустой массив. - Каждый элемент в
fieldsимеет структуру{name, value, type}.name- это техническое имя поля, которое не меняется при редактировании видимой метки; используйте его для сопоставления полей в вашей CRM. - Для полей типа
multichoiceзначениеvalueпредставляет собой массив выбранных опций. Поля типа флажок (checkbox) передаются отдельными записями со значениями"true"/"false". - Для полей типа
fileзначениеvalueпредставляет собой ссылку на скачивание загруженного файла; вебхук никогда не передает содержимое самого файла. pageUrl- страница, на которой находился посетитель во время отправки.
contact_form.submitted
Срабатывает, когда посетитель отправляет форму связи с оператором или кастомную форму, предназначенную для связи с человеком.
{
"eventId": "3a7b9c2d-1e4f-4a6b-8c0d-5e2f7a9b1c3d",
"eventType": "contact_form.submitted",
"timestamp": "2026-08-13T14:25:02Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"email": "jane.doe@example.com",
"message": "I need help with my last invoice.",
"source": "CUSTOM_FORM",
"formCodeName": "contact_form",
"formName": "Contact form",
"fields": [
{"name": "email", "value": "jane.doe@example.com", "type": "email"},
{"name": "order_number", "value": "A-10293", "type": "text"},
{"name": "message", "value": "I need help with my last invoice.", "type": "textarea"}
]
}
}
email- адрес, оставленный посетителем, на который должна ответить ваша служба поддержки.source-CUSTOM_FORM, если за контактной формой стоит кастомная форма, илиCONTACT_FORMдля встроенной формы.formCodeName/formName- идентифицируют кастомную форму, связанную с запросом; оба поля равныnullдля встроенной формы.- Когда используется кастомная форма, каждое заданное в ней поле включается в массив
fields(в том же формате{name, value, type}, что и вlead.created). Для встроенной контактной формы заполняются толькоemailиmessage,fieldsостается пустым массивом, а идентификаторы формы равныnull. message- сопоставленное поле сообщения или все заполненные значения, объединенные вместе, если в форме нет отдельного поля сообщения.
custom_form.submitted
Срабатывает при каждой отправке кастомной формы независимо от ее назначения. Обратите внимание: формы, предназначенные для сбора лидов или связи с оператором, также инициируют свои профильные события lead.created / contact_form.submitted - подписывайтесь на одно или другое в зависимости от того, требуется ли вам общий или специализированный формат, и выполняйте дедупликацию по conversationId + timestamp, если вы подписаны на оба.
{
"eventId": "6c1d8e3f-2a5b-4c7d-9e0f-1a4b6c8d0e2f",
"eventType": "custom_form.submitted",
"timestamp": "2026-08-13T14:27:45Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"formCodeName": "warranty_claim",
"formName": "Warranty claim",
"fields": [
{"name": "order_number", "value": "A-10293", "type": "text"},
{"name": "issue", "value": "Damaged on arrival", "type": "textarea"},
{"name": "photo", "value": "https://api.chatlab.com/aichat/customform/download?key=...&token=...", "type": "file"}
],
"purpose": "STANDALONE"
}
}
formCodeName- стабильное машинное имя формы, которое не меняется при переименовании формы; используйте его для маршрутизации отправок в вашей системе.formName- отображаемое имя, которое видят посетители.fieldsиспользует тот же формат записей{name, value, type}, что иlead.created: значения множественного выбора передаются массивами, а файлы - ссылками на скачивание.purpose-STANDALONE,LEAD_COLLECTIONилиHUMAN_CONTACT, в зависимости от того, как форма привязана к чатботу.
conversation.started
Срабатывает, когда посетитель отправляет первое сообщение нового диалога.
{
"eventId": "8e2f0a4b-3c6d-4e8f-a1b2-2c5d7e9f1a3b",
"eventType": "conversation.started",
"timestamp": "2026-08-13T14:20:11Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"firstMessage": "Do you ship to Canada?",
"chatSource": "WIDGET",
"byAdmin": false,
"countryCode": "PL",
"ipAddress": "83.12.44.7"
}
}
firstMessage- точный текст первого сообщения посетителя. Значение равноnull, если диалог был открыт без текста сообщения.chatSource- канал, через который поступил диалог:WIDGET,WHATSAPP,MESSENGER,VOICE,VOICE_PHONE,API,BOOKING,AIRBNBилиIDOBOOKING.byAdmin- значениеtrue, когда диалог начат через окно предпросмотра чатбота внутри панели администратора ChatLab, а не реальным посетителем. Используйте это, чтобы отсеять собственные тестовые диалоги от CRM.countryCode- код страны ISO, определенный по IP-адресу посетителя, илиnull, если его не удалось определить.ipAddress- IP-адрес посетителя, зафиксированный ChatLab, илиnull, если он недоступен. Считайте его персональными данными в рамках GDPR и сохраняйте только при наличии законных оснований.
conversation.rated
Срабатывает, когда посетитель ставит оценку ответу бота пальцем вверх или пальцем вниз (см. Оценка диалога).
{
"eventId": "1b4c6d8e-5f0a-4b2c-8d3e-4f7a9b1c3d5e",
"eventType": "conversation.rated",
"timestamp": "2026-08-13T14:31:09Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"rating": "POSITIVE"
}
}
rating-POSITIVEилиNEGATIVE. Снятие оценки не вызывает срабатывания события, поэтому нейтральное значение никогда не приходит.
conversation.summarized
Срабатывает, когда ChatLab создает краткое резюме завершенного диалога.
{
"eventId": "4d7e9f1a-6b2c-4d4e-9f0a-5b8c0d2e4f6a",
"eventType": "conversation.summarized",
"timestamp": "2026-08-13T14:45:00Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"summary": "Visitor asked about shipping to Canada and delivery times. The bot confirmed availability and quoted 5-7 business days. Visitor left satisfied.",
"language": "en"
}
}
summary- сгенерированный текст резюме. Резюме формируется через несколько минут после того, как активность в диалоге прекратилась, поэтому это событие приходит позже остальных событий диалога.language- код ISO языка, на котором составлено резюме (соответствует языку диалога).
client.summarized
Срабатывает, когда ChatLab обновляет AI-профиль клиента. Профиль перестраивается на основе предыдущего профиля и резюме только что завершившегося диалога, поэтому данное событие следует за conversation.summarized для того же диалога. Клиенты идентифицируются по e-mail, поэтому данный адрес дублируется на верхнем уровне объекта data.
{
"eventId": "b5d8f1a3-7c2e-4d9b-a6f0-1e3c5a7b9d2f",
"eventType": "client.summarized",
"timestamp": "2026-08-18T09:12:04Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"clientEmail": "jane.doe@example.com",
"client": {
"email": "jane.doe@example.com",
"name": "Jane Doe",
"phone": "+1 555 0123",
"countryCode": "PL",
"ipAddress": "83.12.44.7"
},
"clientSummary": "Returning customer interested in international shipping. Asked about delivery times to Canada twice and about return costs once."
}
}
clientEmail- идентификатор для сопоставления клиента с вашей CRM. Он равенnullдля анонимных посетителей, которые не оставили адрес; событие при этом все равно срабатывает - пропускайте такие доставки, если ваша интеграция опирается на e-mail.client- контактные данные, которые ChatLab хранит для этого пользователя:email,name,phone,countryCodeиipAddress. Все ключи присутствуют всегда; неизвестные значения равныnull.clientSummary- полный текст профиля в виде обычного текста, а не diff. Он полностью заменяет предыдущее резюме, поэтому сохраняйте его путем перезаписи, а не добавления в конец.- Профиль формируется только для ботов со включенной функцией chat memory (память чата) и только для диалогов, в которых активность отсутствовала достаточно долго для формирования резюме. Ожидайте это событие через несколько минут после завершения разговора, а не мгновенно.
live_chat.requested
Срабатывает, когда AI переводит диалог в live chat, будь то по просьбе посетителя или по решению бота о необходимости участия человека.
{
"eventId": "7a0b2c4d-8e3f-4a5b-b0c1-6d9e1f3a5b7c",
"eventType": "live_chat.requested",
"timestamp": "2026-08-13T14:33:20Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"requestedBy": "AI"
}
}
requestedBy- на данный момент всегдаAI, так как перевод всегда инициируется действием live chat бота, в том числе когда посетитель просит об этом обычными словами. Относитесь к этому как к открытому enum: обрабатывайте неизвестные значения вместо жесткой проверки на равенствоAI.- Событие означает, что перевод был запрошен, но не гарантирует, что оператор подключился. Дождитесь события
live_chat.started.
live_chat.started
Срабатывает, когда оператор подключается и сессия Live Chat фактически начинается.
{
"eventId": "0c3d5e7f-9a4b-4c6d-a1b2-7e0f2a4b6c8d",
"eventType": "live_chat.started",
"timestamp": "2026-08-13T14:33:55Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {}
}
- Поле
dataнамеренно оставлено пустым. Все необходимые сведения содержатся в конверте:botIdидентифицирует чатбота, аconversationId/sessionIdсвязывают событие с диалогом, по которому вы ранее получилиlive_chat.requested.
live_chat.ended
Срабатывает при завершении сессии Live Chat.
{
"eventId": "2e5f7a9b-0c5d-4e7f-b2c3-8f1a3b5c7d9e",
"eventType": "live_chat.ended",
"timestamp": "2026-08-13T14:52:41Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"durationSeconds": 1126
}
}
durationSeconds- длительность нахождения оператора в диалоге, отсчитываемая с момента запуска сессии. Поле опускается в редких случаях, когда сессия завершается, так и не начавшись.
ai_action.executed
Срабатывает каждый раз, когда бот выполняет AI action - вызов встроенной интеграции или кастомную функцию API. Это высокочастотное событие: активный e-commerce бот может выполнять сотни действий в день, а одна реплика посетителя может вызвать сразу несколько. Подписывайтесь на него через отдельный эндпоинт или убедитесь, что ваш приемник способен справляться с такой нагрузкой.
{
"eventId": "5f8a0b2c-1d6e-4f8a-c3d4-9a2b4c6d8e0f",
"eventType": "ai_action.executed",
"timestamp": "2026-08-13T14:21:03Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"actionName": "search_products",
"status": "SUCCESS",
"durationMs": 842,
"errorMessage": null
}
}
actionName- имя выполненного действия, каким его видит AI, напримерsearch_productsдля встроенной интеграции или имя, заданное вами для кастомного действия API.status-SUCCESSилиERROR.durationMs- продолжительность выполнения действия в миллисекундах. Полезно для выявления медленных интеграций до того, как на них начнут жаловаться посетители.errorMessage- причина сбоя, заполняется только в случае, еслиstatusравенERROR; в противном случае -null.
webhook.test
Отправляется по нажатию кнопки Send sample event (Отправить тестовое событие) при выполнении стандартной проверки доступности. Подписывается точно так же, как и реальное событие.
{
"eventId": "9b2c4d6e-3f8a-4b0c-d5e6-0b3c5d7e9f1a",
"eventType": "webhook.test",
"timestamp": "2026-08-13T14:10:00Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"message": "Test delivery from ChatLab"
}
}
message- фиксированный неизменяемый текст. Поля конверта содержат демонстрационные значения, поэтому никогда не обрабатывайте доставкуwebhook.testкак реальные данные.- Это единственный тип события, на который нельзя подписаться в настройках эндпоинта: оно отправляется вручную из панели администратора и всегда поступает на тот эндпоинт, для которого вы нажали кнопку, независимо от списка выбранных событий.
Безопасность: проверка доставки
Каждая доставка содержит четыре заголовка:
| Header | Value |
|---|---|
X-ChatLab-Signature |
sha256=<hex hmac> - подпись HMAC-SHA256 полезной нагрузки |
X-ChatLab-Timestamp |
Время Unix в секундах, когда доставка была подписана |
X-ChatLab-Event |
Тип события, например lead.created |
X-ChatLab-Delivery |
Уникальный идентификатор доставки, совпадающий с eventId в теле запроса |
Подпись вычисляется как HMAC-SHA256 от строки {timestamp}.{rawBody} с использованием секретного ключа вашего эндпоинта, где {timestamp} - значение заголовка X-ChatLab-Timestamp, а {rawBody} - необработанное, нераспарсенное тело запроса. Всегда выполняйте проверку по необработанным байтам - повторная сериализация распарсенного JSON изменит последовательность байтов и нарушит подпись.
Для защиты от атак повторного воспроизведения отклоняйте доставки, у которых X-ChatLab-Timestamp старше 5 минут.
Node.js
const crypto = require('crypto');
function verifyChatLabSignature(req, secret) {
const signature = req.headers['x-chatlab-signature'];
const timestamp = req.headers['x-chatlab-timestamp'];
if (!signature || !timestamp) return false;
// Reject stale deliveries (older than 5 minutes)
const ageSeconds = Math.abs(Date.now() / 1000 - Number(timestamp));
if (ageSeconds > 300) return false;
// rawBody must be the raw request body bytes, not re-serialized JSON.
// With Express: app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } }))
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(timestamp + '.' + req.rawBody)
.digest('hex');
const a = Buffer.from(signature);
const b = Buffer.from(expected);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
PHP
<?php
function verifyChatLabSignature(string $secret): bool
{
$signature = $_SERVER['HTTP_X_CHATLAB_SIGNATURE'] ?? '';
$timestamp = $_SERVER['HTTP_X_CHATLAB_TIMESTAMP'] ?? '';
if ($signature === '' || $timestamp === '') {
return false;
}
// Reject stale deliveries (older than 5 minutes)
if (abs(time() - (int) $timestamp) > 300) {
return false;
}
$rawBody = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret);
return hash_equals($expected, $signature);
}
Если проверка не удалась, верните 401 и отбросьте полезную нагрузку. Никогда не обрабатывайте непроверенные доставки - любой, кто узнает ваш URL, может отправить на него произвольный JSON через POST.
Особенности доставки
Учтите эти гарантии перед разработкой интеграций на базе webhook:
- Отвечайте быстро. Ваш эндпоинт должен ответить в течение 3 секунд, иначе доставка будет считаться неудавшейся. Немедленно отправьте статус
2xxи обрабатывайте полезную нагрузку асинхронно (поставьте ее в очередь, затем подтвердите получение) - не выполняйте вызовы CRM или запись в базу данных до отправки ответа. - Fire-and-forget, не более одного раза (at-most-once). Для каждого события выполняется ровно одна попытка доставки - повторных попыток нет. Если ваш эндпоинт недоступен, превышено время ожидания или возвращен статус, отличный от 2xx, это событие теряется и не будет отправлено повторно. Webhook - это уведомления, а не реплицированное хранилище данных: если вам требуется гарантированная полнота данных, сверяйте их с Management API или выгрузками лидов.
- Автоматический прерыватель цепи (circuit breaker). После 5 последовательных неудачных доставок для бота доставки для этого бота приостанавливаются на 5 минут. События, происходящие во время паузы, отбрасываются, а в журнале доставки появляются записи
CIRCUIT_OPEN, чтобы вы могли точно видеть, когда и почему отправка трафика была заблокирована. Доставки, пропущенные из-за разомкнутой цепи, не учитываются при автоматическом отключении. - Автоматическое отключение. Проверка выполняется в момент неудачной доставки, а не по расписанию. Если доставка не удалась и в течение 7 дней не было ни одной успешной доставки - отсчитывая от последнего успеха или от даты создания эндпоинта, если успешных доставок еще не было, - эндпоинт отключается, а вы получаете уведомление по электронной почте. Один статус
2xxв любой момент сбрасывает этот таймер. Эндпоинт, не получающий трафика, никогда не отключается, поскольку в нем ничего не завершается ошибкой. Включите его заново в Account settings (настройки аккаунта), как только ваш приемник будет исправлен; счетчик ошибок и отметка автоматического отключения сбрасываются при повторном включении, а события, пропущенные во время отключения, задним числом не восполняются. - 410 Gone. Если ваш эндпоинт отвечает со статусом HTTP
410 Gone, ChatLab немедленно отключает его. Используйте это для программного вывода эндпоинта из эксплуатации на стороне приемника. - Идемпотентность. Повторные доставки при нормальной работе не ожидаются, но если ваша обработка должна быть строго идемпотентной, выполняйте дедупликацию по
eventId(также доступно в заголовкеX-ChatLab-Delivery).
Лимиты
- До 10 webhook-эндпоинтов на один аккаунт.
- Хранение журнала доставок: 14 дней. Более старые записи удаляются автоматически.
Связанные статьи
- Сбор лидов - форма, стоящая за
lead.created - Форма обращения в поддержку - форма, стоящая за
contact_form.submitted - Live Chat - сценарий работы событий
live_chat.* - Оценка диалога - пальцы вверх/вниз за событием
conversation.rated - AI Actions - интеграции, стоящие за
ai_action.executed - Chat API - колбэки виджета в браузере (клиентский аналог webhook)
- Management API - REST API для управления ботами и данными об использовании