Начать
Документация

Webhook-алерты

CronAlive отправляет POST-запрос на ваш URL при каждом событии чека. Тело подписывается HMAC-SHA256, формат тела настраивается шаблоном.

Настройка

Дашборд → Интеграции → Новая интеграция → Webhook: укажите URL, при желании — секрет подписи, шаблон тела и Content-Type. Как и для других каналов, работают фильтры по событиям (down / up / late) и тегам, тихие часы и напоминания.

Payload по умолчанию

Без шаблона приходит JSON (Content-Type: application/json):

{
  "event": "down",
  "check": {
    "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "name": "nightly backup",
    "tags": ["backups", "prod"],
    "status": "down",
    "previous_status": "late"
  },
  "reason": "timeout",
  "ts": "2026-07-21T00:30:00+00:00",
  "subject": "🔴 nightly backup — DOWN",
  "message": "Чек «nightly backup» упал…"
}

Проверка подписи

Если задан секрет, каждый запрос содержит заголовок X-CronAlive-Signature — hex(HMAC-SHA256) от сырого тела запроса (в том числе при кастомном шаблоне):

# PHP
$valid = hash_equals(
    hash_hmac('sha256', $request->getContent(), $secret),
    $request->header('X-CronAlive-Signature')
);

# Python
import hmac, hashlib
valid = hmac.compare_digest(
    hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest(),
    request.headers["X-CronAlive-Signature"],
)

Кастомный шаблон тела

Поле «Шаблон тела» заменяет payload целиком: плейсхолдеры {{…}} подставляются значениями события. Так вебхук встраивается в любой сторонний формат без прослоек.

Плейсхолдер Значение
{{event}}down / up / late / ssl_expiring
{{check_id}}UUID чека
{{check_name}}имя чека
{{status}}новый статус чека
{{previous_status}}предыдущий статус (пусто для SSL)
{{reason}}причина флипа
{{ts}}время события, ISO 8601
{{tags}}теги чека через запятую
{{subject}}заголовок алерта (локализованный)
{{message}}текст алерта (многострочный)

Пример — формат стороннего мессенджера:

{"text": "{{subject}}", "channel": "#ops", "meta": {"check": "{{check_name}}", "state": "{{status}}"}}

При Content-Type: application/json (по умолчанию) значения подставляются JSON-экранированными — кавычки и переносы строк в {{message}} не ломают документ. Для других Content-Type (например, text/plain) подстановка «как есть»:

ALERT {{check_name}} is {{status}} ({{reason}})

Доставка и повторные попытки

Успех — любой 2xx-ответ. Ошибка или таймаут (10 сек) — до 3 попыток с паузами 10 с → 1 мин → 5 мин; статус каждой доставки и текст ошибки видны в журнале интеграции (кнопка Журнал).