Вебхуки
Как включить
Передайте в запросе операции webhook_url — https-адрес вашего сервера. Когда операция завершится, SmartPDF отправит на него POST с JSON:
{
"event": "task.done",
"task_id": "3f2c5b0e-8a41-4d7e-9c1f-5d0b8f2e7a64",
"operation_type": "compress",
"status": "done",
"timestamp": "2026-10-05T11:00:00.512341+00:00",
"download_url": "https://api.smartpdf.ru/v1/tasks/3f2c5b0e-…/file?token=…",
"filename": "document_smartpdf.pdf"
}У неудачной операции — "event": "task.failed" и error_message вместо ссылки. Ссылка в вебхуке действует час.
Доставка
Ответьте кодом 2xx. Иначе будет ещё три попытки — через 10, 30 и 90 секунд. Редиректы не выполняются.
Заголовки:
X-SmartPDF-Event— событие, как в теле;X-SmartPDF-Delivery— id операции, одинаковый у повторов: по нему отсекайте дубли;X-SmartPDF-Signature: t=<unix-время>,v1=<подпись>.
Проверка подписи
Секрет — в личном кабинете, в разделе «API и MCP»; там же выпускается новый, старый сразу перестаёт действовать. Подпись — HMAC-SHA256 от строки <t>.<тело запроса как есть> в hex. Сравнивайте в постоянном времени и отклоняйте запросы старше 5 минут. Проверяйте сырое тело запроса — до разбора JSON.
# verify <секрет> <файл с телом запроса> <заголовок X-SmartPDF-Signature> — нужны openssl и date
verify() {
local secret=$1 body=$2 header=$3 t v1 now expected
t=$(printf "%s" "$header" | tr "," "\n" | sed -n "s/^t=//p")
v1=$(printf "%s" "$header" | tr "," "\n" | sed -n "s/^v1=//p")
now=$(date +%s)
[ -n "$t" ] && [ $((now - t)) -le 300 ] && [ $((t - now)) -le 300 ] || return 1
expected=$({ printf "%s." "$t"; cat "$body"; } | openssl dgst -sha256 -hmac "$secret" -hex | sed "s/^.* //")
[ "$expected" = "$v1" ]
}Каждый пример проверен запуском: настоящая подпись принимается, подменённое тело и старая метка времени — отклоняются.