Вебхуки
Нотифлоу шлет HTTP POST на ваш endpoint при каждом подписанном событии. Тело — JSON в UTF-8, подпись — HMAC-SHA256 секрета вебхука в заголовке X-Notiflow-Signature-256.
Настройка
Кабинет: Интеграции → Вебхуки → Создать. Секрет генерируется автоматически; показывается один раз — сохраните в хранилище.
Каталог событий
Активные события — реально отправляются при наступлении:
| Событие | Когда отправляется |
|---|---|
chat_new | Новый диалог в поддержке (виджет, Телеграм, MAX, ВКонтакте, email) |
chat_message | Сообщение от посетителя или оператора (без внутренних заметок) |
chat_closed | Диалог закрыт |
contact_identified | Анонимный посетитель идентифицирован через _nf('identify') или /v1/contacts |
contact.score_tier_changed | Изменился tier лида (cold → warm → hot) |
widget_show | Виджет показан посетителю |
widget_click | Клик по CTA в виджете |
widget_submit | Сабмит формы/квиза/NPS |
ai_auto_reply | ИИ-помощник ответил клиенту без оператора (автоответ или ИИ-узел сценария) |
ai_summary_generated | Сгенерирована сводка диалога |
email_received | Входящее письмо от клиента принято в диалог email-канала |
email_sent | Ответ оператора передан SMTP-серверу (доставка подтверждается отдельно, отказ придет как bounce) |
crm_lead_created | Лид или сделка созданы в подключенной CRM (Битрикс24, amoCRM) |
crm_deal_updated | Сделка в CRM обновлена: статус по lead score или заметка-сводка при закрытии диалога |
Зарезервированные события — объявлены в контракте и доступны для подписки в кабинете, но отправка пока не включена. Подписка на них безопасна: доставки начнутся с релизом соответствующей функции, о чем сообщим в changelog.
| Событие | Что будет означать |
|---|---|
form_submitted | Отправлена standalone-форма |
Проверка подписи
Подпись считается по сырому телу запроса (не по распарсенному JSON). Каждая доставка несет два заголовка:
X-Notiflow-Signature-256: sha256=<hex> ← используйте этот
X-Notiflow-Signature: <hex> ← устаревший, будет отключен
Проверяйте X-Notiflow-Signature-256: значение — sha256= плюс hex HMAC-SHA256 от тела запроса на секрете вебхука. Старый заголовок содержит тот же hex без префикса и оставлен для совместимости с уже написанными интеграциями.
Node.js
const crypto = require('crypto');
function verify(rawBody, header, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(header),
Buffer.from(expected)
);
}
// verify(rawBody, req.headers['x-notiflow-signature-256'], secret)
Python
import hmac, hashlib
def verify(raw_body: bytes, header: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(), raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(header, expected)
# verify(request.data, request.headers['X-Notiflow-Signature-256'], secret)
PHP
function verify(string $rawBody, string $header, string $secret): bool {
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
return hash_equals($expected, $header);
}
// verify($rawBody, $_SERVER['HTTP_X_NOTIFLOW_SIGNATURE_256'], $secret);