Webhooks
Real-time event delivery во внешние системы через HTTP POST с HMAC-SHA256 подписью и retry с exponential backoff
Обзор
Webhooks доставляют события FlowLink во внешние системы (Slack, Telegram, PagerDuty, SIEM, custom endpoints) в реальном времени через HTTP POST. Каждый webhook включает event type, payload и HMAC-SHA256 подпись для верификации. Поддерживается retry policy с exponential backoff (до 5 попыток), фильтрация по типам событий и мониторинг доставки через delivery log.
Типы событий
17 типов: команды, агенты, сессии, политики, approvals
Все тарифы
HMAC-SHA256
Цифровая подпись каждого запроса
Все тарифы
Retry Policy
Exponential backoff до 5 попыток
Все тарифы
Delivery Log
Полный журнал доставок с статусами
Все тарифы
Архитектура доставки
Каждое событие в FlowLink проходит через Webhook Dispatcher: событие сериализуется в JSON payload, вычисляется HMAC-SHA256 подпись с использованием shared secret, затем payload отправляется на целевой URL через HTTP POST. Ответ ожидается в течение timeout (default: 10s). При неудаче — retry с exponential backoff. Все доставки логируются для диагностики.
# Webhook delivery pipeline
1. Генерация:
Shield / Agent / Session → audit event
# 2. Маршрутизация:
Фильтрация по event_type → подходящие webhooks
# 3. Подпись:
HMAC-SHA256(payload, secret) → X-FlowLink-Signature
# 4. Доставка:
HTTP POST → ожидание 2xx → retry при ошибке
Типы событий
FlowLink поддерживает 17 типов событий, сгруппированных в 4 категории. Каждый webhook можно настроить на получение одного или нескольких типов событий.
| Категория | Тип события | Описание |
|---|---|---|
| Команды | command_executed | Команда выполнена успешно |
| Команды | command_denied | Команда заблокирована политикой |
| Команды | command_timeout | Команда превышена по времени |
| Агенты | agent_connected | Агент подключился к серверу |
| Агенты | agent_disconnected | Агент отключился от сервера |
| Агенты | agent_health_changed | Изменился health status агента |
| Агенты | agent_created | Зарегистрирован новый агент |
| Агенты | agent_deleted | Агент удалён из системы |
| Сессии | session_started | Началась новая сессия MCP |
| Сессии | session_closed | Сессия MCP завершена |
| Сессии | session_timeout | Сессия MCP истекла по таймауту |
| Политики | policy_created | Создана новая политика |
| Политики | policy_updated | Политика обновлена |
| Политики | policy_deleted | Политика удалена |
| Approvals | approval_requested | Запрошено одобрение команды |
| Approvals | approval_resolved | Одобрение разрешено/отклонено |
| Compliance | compliance_report_generated | Сгенерирован compliance отчёт |
Формат payload
Каждый webhook delivery содержит стандартный набор HTTP headers и JSON body с полным контекстом события. Payload включает event metadata, данные агента и специфичный для типа события контент.
1POST /your-webhook-url HTTP/1.12Content-Type: application/json3X-FlowLink-Event: command_denied4X-FlowLink-Signature: sha256=abc123def456...5X-FlowLink-Delivery: del_xyz7896X-FlowLink-Timestamp: 2026-01-15T14:30:00Z78{9 "event_id": "evt_abc123",10 "event_type": "command_denied",11 "timestamp": "2026-01-15T14:30:00Z",12 "organization_id": "org_xyz",13 "agent_id": "agent-prod-01",14 "delivery_id": "del_xyz789",15 "payload": {16 "command": "rm -rf /tmp/app",17 "shield_result": {18 "risk_score": 95,19 "threats": ["destructive_command", "path_traversal"],20 "layer": "L2"21 },22 "policy_id": "pol_deny_rm",23 "session_id": "sess_abc123",24 "correlation_id": "mcp:1705332000123:a1b2c3d4",25 "user": "claude-agent"26 }27}
Схема payload
| Поле | Тип | Описание |
|---|---|---|
| event_id | string | Уникальный ID события (UUID v4) |
| event_type | string | Тип события (см. выше) |
| timestamp | string | ISO 8601 время события |
| organization_id | string | ID организации |
| agent_id | string | ID агента (если применимо) |
| delivery_id | string | ID доставки (для трекинга) |
| payload | object | Полезная нагрузка события |
HMAC-SHA256 верификация
Каждый webhook запрос подписан HMAC-SHA256. Подпись передаётся в заголовке X-FlowLink-Signature в формате sha256=<hex>. Для верификации необходимо вычислить HMAC-SHA256 от raw body запроса с использованием shared secret webhook.
Python (FastAPI / Flask)
1import hmac, hashlib23def verify_webhook(request):4 secret = "whk_your_secret"5 signature = request.headers.get(6 "X-FlowLink-Signature", ""7 ).replace("sha256=", "")8 expected = hmac.new(9 secret.encode(),10 request.body,11 hashlib.sha25612 ).hexdigest()13 return hmac.compare_digest(signature, expected)
Node.js (Express)
1const crypto = require('crypto');23function verifyWebhook(req) {4 const secret = 'whk_your_secret';5 const signature = req.headers['x-flowlink-signature']6 .replace('sha256=', '');7 const expected = crypto8 .createHmac('sha256', secret)9 .update(req.rawBody)10 .digest('hex');11 return signature === expected;12}
Go
1func verifyWebhook(body []byte, signature, secret string) bool {2 mac := hmac.New(sha256.New, []byte(secret))3 mac.Write(body)4 expected := hex.EncodeToString(mac.Sum(nil))5 return hmac.Equal([]byte(signature), []byte(expected))6}
Retry Policy
При неудачной доставке (non-2xx ответ или timeout) FlowLink автоматически повторяет отправку с exponential backoff. После 5 неудачных попыток webhook автоматически переходит в статус disabled и отправляет уведомление администратору.
| Попытка | Задержка | Макс. timeout | Действие при неудаче |
|---|---|---|---|
| 1 | 30s | 10s | Retry #2 |
| 2 | 2m | 10s | Retry #3 |
| 3 | 10m | 10s | Retry #4 |
| 4 | 30m | 10s | Retry #5 |
| 5 | 1h | 10s | Disable webhook + notify admin |
1{2 "retry_policy": {3 "max_retries": 5,4 "backoff_multiplier": 6,5 "initial_delay_seconds": 30,6 "max_delay_seconds": 3600,7 "timeout_seconds": 10,8 "auto_disable": true9 }10}
Статус доставки
Каждая доставка логируется с полным статусом. Статусы: pending → sending → succeeded / failed / timed_out. Delivery log хранится 30 дней и доступен через API.
succeeded
2xx ответ получен
failed
Non-2xx или connection error
timed_out
Превышен timeout (10s)
pending
Ожидает отправки
Настройка через конфигурацию
Webhooks можно создавать через REST API или Dashboard. Ниже — пример конфигурации через API.
1curl -X POST "https://api.flowlink.io/v1/webhooks" \2 -H "Authorization: Bearer $TOKEN" \3 -H "Content-Type: application/json" \4 -d '{5 "name": "slack-security-alerts",6 "url": "https://hooks.slack.com/services/T0/B0/xxx",7 "secret": "whk_your_webhook_secret",8 "events": ["command_denied", "agent_health_changed", "approval_requested"],9 "headers": {10 "X-Custom-Header": "my-value"11 },12 "retry_policy": {13 "max_retries": 5,14 "backoff_multiplier": 615 },16 "active": true17 }'
1{2 "id": "web_abc123",3 "name": "slack-security-alerts",4 "url": "https://hooks.slack.com/services/T0/B0/xxx",5 "active": true,6 "events": ["command_denied", "agent_health_changed", "approval_requested"],7 "custom_headers": { "X-Custom-Header": "my-value" },8 "retry_policy": {9 "max_retries": 5,10 "backoff_multiplier": 611 },12 "created_at": "2026-01-15T14:00:00Z",13 "delivery_count": 0,14 "last_delivery_at": null15}
API Reference
Полный CRUD для управления webhook endpoints, включая тестирование и просмотр лога доставок.
POST /api/v1/webhooksСоздать webhookGET /api/v1/webhooksСписок всех webhooks организацииGET /api/v1/webhooks/{id}Получить webhook по IDPATCH /api/v1/webhooks/{id}Обновить webhook (URL, events, secret)DELETE /api/v1/webhooks/{id}Удалить webhookPOST /api/v1/webhooks/{id}/testТестовая отправка (ping event)POST /api/v1/webhooks/{id}/enableВключить webhookPOST /api/v1/webhooks/{id}/disableОтключить webhookGET /api/v1/webhooks/{id}/deliveriesЛог доставок webhookGET /api/v1/webhooks/{id}/deliveries/{del_id}Детали конкретной доставкиDelivery Log API
1# Просмотр доставок webhook2curl -s "https://api.flowlink.io/v1/webhooks/web_abc123/deliveries?limit=5" \3 -H "Authorization: Bearer $TOKEN" | jq
1{2 "deliveries": [3 {4 "id": "del_xyz789",5 "webhook_id": "web_abc123",6 "event_id": "evt_abc123",7 "event_type": "command_denied",8 "status": "succeeded",9 "http_status": 200,10 "response_time_ms": 245,11 "attempt": 1,12 "sent_at": "2026-01-15T14:30:00Z",13 "response_body": "ok"14 }15 ],16 "pagination": {17 "total": 1247,18 "limit": 5,19 "offset": 0,20 "has_more": true21 }22}
Пример: Slack интеграция
Ниже пример настройки webhook для отправки security-алертов в Slack канал.
1# Создаём webhook для Slack2curl -X POST "https://api.flowlink.io/v1/webhooks" \3 -H "Authorization: Bearer $TOKEN" \4 -H "Content-Type: application/json" \5 -d '{6 "name": "security-alerts-slack",7 "url": "https://hooks.slack.com/services/T00/B00/XXXXXXXX",8 "secret": "whk_slack_secret",9 "events": ["command_denied", "approval_requested", "agent_health_changed"],10 "headers": { "Content-Type": "application/json" }11 }'
Устранение неполадок
Webhook не доставляет события
Проверьте статус через GET /webhooks/{id}. Убедитесь в поле active: true и доступности URL. Проверьте delivery log для конкретных ошибок.
HMAC signature verification failed
Убедитесь, что верифицируете raw body (не парсенный JSON). Header X-FlowLink-Signature содержит sha256=<hex>. Используйте hmac.compare_digest для timing-safe сравнения.
Webhook auto-disabled
После 5 неудачных попыток webhook автоматически отключается. Проверьте target endpoint на доступность, исправьте проблему, затем вызовите POST /webhooks/{id}/enable.
Дублирование событий
Дедуплицируйте по полю event_id или delivery_id. FlowLink гарантирует at-least-once доставку, но не exactly-once.
Timeout при доставке
Default timeout — 10 секунд. Если обработка на стороне получателя занимает больше времени, используйте асинхронную обработку: верните 2xx сразу, обрабатывайте в фоне.
Лучшие практики
Фильтруйте события
Подписывайтесь только на нужные типы событий. Избегайте подписки на все 17 типов, если нужны только 2-3. Это снижает нагрузку на endpoint и упрощает обработку.
Всегда верифицируйте HMAC
Никогда не пропускайте верификацию подписи. Используйте timing-safe сравнение для защиты от timing attacks.
Возвращайте 2xx быстро
Если обработка долгая — верните 200 немедленно, обрабатывайте payload асинхронно. Это предотвращает timeout retries.
Используйте delivery log
Delivery log хранит историю всех доставок. Используйте его для диагностики проблем и мониторинга здоровья webhook.
Ротируйте secrets
Регулярно обновляйте webhook secret через PATCH /webhooks/{id}. Старый secret деактивируется после grace period.
Тестируйте перед продакшеном
Используйте POST /webhooks/{id}/test для тестовой отправки ping event. Проверьте endpoint, логирование и обработку.