Вебхуки

Вместо опроса передайте в запросе генерации callback_url. Когда задача завершится, мы отправим на этот адрес POST с объектом задачи.

Требования к адресу

  • Только https://, порт 443 или 8443, без логина и пароля в URL.
  • Домен должен указывать на публичный IP. Внутренние сети, localhost и служебные адреса запрещены.
  • Ответьте кодом 2xx за 10 секунд. Перенаправления (3xx) не выполняются.

События

СобытиеКогда
task.succeededГенерация готова
task.failedГенерация не удалась, Мысли возвращены по правилам
task.cancelledЗадача отменена или истекло время ожидания в очереди
{
  "id": "evt_2hWc9L…",
  "object": "event",
  "type": "task.succeeded",
  "created_at": "2026-09-28T15:05:42.300Z",
  "data": { "id": "cmg4k9x2a…", "object": "task", "status": "succeeded", "result": { "files": [ … ] }, … }
}

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

Каждый вебхук подписан HMAC-SHA256. Секрет подписи (whsec_…) — в личном кабинете, в настройках ключа («Секрет подписи вебхуков»). При пересоздании ключа секрет меняется. Подпись считается от строки {timestamp}.{тело запроса}. Отклоняйте запросы старше 5 минут — это защищает от повторной отправки перехваченного запроса.

import hmac, hashlib, time

def verify(secret: str, raw_body: bytes, header: str, tolerance: int = 300) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    ts, sig = int(parts["t"]), parts["v1"]
    if abs(time.time() - ts) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, sig)

Повторы

Если ваш сервер не ответил 2xx, отправка повторяется через 30 секунд, 2 минуты, 10 минут, 30 минут, 2 часа и 6 часов (всего 7 попыток). Одно и то же событие может прийти повторно — обрабатывайте его идемпотентно по X-Neuronovo-Delivery или по data.id.

Вебхук — дополнение к опросу. Если ваш сервер был недоступен, статус задачи всегда можно получить через GET /v1/tasks/{id}.