НОРМОСКАН Документация
API v1Уведомления на ваш сервер

Уведомления на ваш сервер

Обновлено 8 октября 2026

Уведомления подключаются отдельно. Передайте HTTPS-адрес обработчика при подключении. Согласуйте секрет подписи. Проверьте webhook_configured в ответе GET /me. Если значение равно false, используйте опрос.

Настроенный адрес доступен в webhook_url ответа GET /key, если подключение возвращает эти сведения.

События: run.finished и run.failed. НОРМОСКАН отправляет POST с JSON на ваш адрес. Заголовок X-NK-Event содержит событие. При заданном секрете заголовок X-NK-Signature содержит подпись. После уведомления получите состояние и результат через API.

Уведомление не содержит текст замечаний.

Пример тела уведомления

json
{
  "event": "run.finished",
  "run_id": "9f1c3b7a-2d4e-4c8b-9a1f-6e5d4c3b2a10",
  "tenant_id": "example-company",
  "api_version": "v1",
  "at": "2026-09-29T12:00:00+00:00",
  "status": "done", "findings": 8, "refunded": false,
  "pages_total": 120, "checks_left": 11
}

Проверка HMAC-SHA256 на Python

python
import hashlib
import hmac

def valid_signature(raw_body: bytes, signature: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode("utf-8"), raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

# raw_body — исходные байты HTTP-запроса до разбора JSON.
# signature — значение X-NK-Signature; при отсутствии передайте "".
# secret — согласованный секрет уведомлений, не ключ API.

Сначала верните ответ 2xx. Затем обработайте результат. По умолчанию сервер делает до 4 попыток и ждёт ответ до 15 секунд. Паузы между попытками: 2, 4 и 6 секунд. Настройки подключения могут отличаться.

Ответ 4xx прекращает повторы, кроме ответа 429.

Определяйте дубликаты по паре run_id и event. Получите журнал через GET /webhooks/deliveries?run_id=…. pending означает ожидание доставки. delivered означает получение 2xx. rejected означает отказ вашего сервера.

failed означает, что попытки закончились. denied означает запрет адреса настройками. Если уведомление не пришло, получите статус проверки через опрос.