Webhook-уведомления

Настройка эндпоинта, подпись запросов, структура и примеры тел запросов для всех типов уведомлений


Вебхук в Statuser - это HTTP POST-запрос на ваш URL-эндпоинт при наступлении событий мониторинга и аккаунта.

Этот канал удобно использовать для интеграции с вашими системами: корпоративные чаты, внутренние сервис-дески, SIEM, внутренние панели и собственные автоматизации.

На аккаунт можно добавить до 20 вебхуков. Для каждого вебхука можно отдельно выбрать, какие типы уведомлений отправлять.

Как работает доставка

  • Statuser отправляет POST c application/json на URL вебхука.
  • Успешной доставкой считается только ответ с кодом 2xx.
  • Таймаут запроса: 7 секунд.
  • Редиректы не поддерживаются (3xx считается ошибкой доставки).
  • Если у эндпоинта задан секрет, запрос подписывается заголовком X-Statuser-Signature.
  • Для вебхука нужен публичный URL.

Заголовки запроса

Каждый вебхук-запрос содержит следующие заголовки:

Content-Type: application/json
User-Agent: Mozilla/5.0 (compatible; Statuser Webhook; https://statuser.cloud/)
X-Statuser-Event: service_unavailable
X-Statuser-Subscription-Type: service_alerts
X-Statuser-Signature: sha256=<hex>   // только если указан secret

Где:

  • X-Statuser-Event - конкретный тип события (notification_type).
  • X-Statuser-Subscription-Type - группа уведомлений (например, service_alerts, dns_alerts, billing_alerts).
  • X-Statuser-Signature - HMAC-подпись тела запроса.

Подпись секрета (HMAC SHA-256)

Если у вебхука заполнен секрет, Statuser:

  1. Берет JSON body в строковом виде;
  2. Считает HMAC SHA-256 по вашему secret;
  3. Отправляет результат в виде sha256=<hex> в X-Statuser-Signature.

Проверка подписи на вашей стороне (Node.js):

import crypto from 'crypto';
 
function verifyStatuserSignature(
  rawBody: string,
  secret: string,
  header?: string
) {
  if (!header?.startsWith('sha256=')) return false;
 
  const received = header.slice('sha256='.length);
  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
 
  return crypto.timingSafeEqual(
    Buffer.from(received, 'hex'),
    Buffer.from(expected, 'hex')
  );
}

Формат payload

Во всех вебхук-событиях есть базовые поля:

{
  "notification_type": "service_unavailable",
  "subscription_type": "service_alerts",
  "created_at": "2026-02-16T10:21:30.000Z",
  "account_id": 42
}

Дополнительные поля зависят от notification_type.

Контракты body по типам уведомлений

Ниже приведены примеры для каждого типа уведомлений, доступного в вебхуках.