Вебхуки
Вместо опроса передайте в запросе генерации 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}.