CronAlive отправляет POST-запрос на ваш URL при каждом событии чека. Тело подписывается HMAC-SHA256, формат тела настраивается шаблоном.
Дашборд → Интеграции → Новая интеграция → Webhook: укажите URL, при желании — секрет подписи, шаблон тела и Content-Type. Как и для других каналов, работают фильтры по событиям (down / up / late) и тегам, тихие часы и напоминания.
Без шаблона приходит 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» упал…"
} event — down / up / late, для SSL-алертов — ssl_expiring;reason — timeout / fail / exit / ping / ssl;event: down и темой напоминания в subject.
Если задан секрет, каждый запрос содержит заголовок
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 мин; статус каждой доставки и текст ошибки видны в журнале интеграции (кнопка Журнал).