Перейти к содержимому
Business · Business Pro

Webhooks для тендеров

Получайте события AI-анализа в свой CRM, Telegram-бот или 1С — без опроса API.

Как это работает

Три шага до первой доставки

Шаг 1
Создайте endpoint в дашборде

Укажите HTTPS-URL вашего сервера. Сохраните signing_secret — он показывается единожды. Несколько endpoint-ов можно настроить одновременно.

Шаг 2
TenderPulse подписывает каждое событие HMAC-SHA256

Каждый POST содержит заголовок X-Webhook-Signature: sha256=… Подпись считается от timestamp + raw body. Replay-защита — 5-минутное окно.

Шаг 3
Ваш сервер обрабатывает POST и возвращает 2xx

Получили событие, обработали, вернули 200 — доставка считается успешной. Не-2xx или таймаут — автоматический повтор по расписанию.

Что вы получите

Интеграция без компромиссов

Мгновенноpush

POST поступает в течение секунды после завершения AI-анализа. Никаких задержек опроса — ваш CRM узнаёт о результате раньше, чем вы откроете браузер.

Надёжно6 попыток

6 попыток за 13.5 часов с half-jitter. Auto-disable после 5 подряд неудач. Ручной replay из лога доставок — если сервер был временно недоступен.

БезопасноHMAC + SSRF

HMAC-SHA256 подпись тела запроса. HTTPS-only. Защита от SSRF и DNS rebinding — URL проверяется по 18 блок-сетям до и в момент запроса.

Прозрачнолог

Лог последних доставок с кодом ответа, телом и временем. Replay в один клик. Тест-запуск из дашборда — убедитесь, что endpoint отвечает, без ожидания реального события.

Пример события

Тип tender.analyzed — единственный production-тип на данный момент

POST https://your-server.example/webhook
{
  "id": "8b3a...-uuid",
  "type": "tender.analyzed",
  "created": 1716000000,
  "api_version": "2026-05-18",
  "data": {
    "tender_id": 12345,
    "eis_id": "0173100009325000142",
    "verdict": "profitable",
    "margin_percent": 14.3,
    "margin_rub": 87000.0,
    "confidence": "high",
    "analyzed_at": "2026-05-18T10:00:00+00:00"
  }
}
Дедупликация: Поле id — стабильный UUID события. При retry остаётся тем же. Используйте его для ON CONFLICT DO NOTHING на своей стороне.

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

Всегда проверяйте подпись перед обработкой тела

verify.py
import hmac
import hashlib
import time

def verify(
    secret: str,
    timestamp: str,
    body_bytes: bytes,
    signature_header: str,
) -> bool:
    # 1. Защита от replay — 5-минутное окно
    if abs(time.time() - int(timestamp)) > 300:
        return False
    # 2. Пересчёт HMAC от raw bytes
    #    (НЕ от re-serialized JSON)
    expected = hmac.new(
        secret.encode(),
        f"{timestamp}.".encode() + body_bytes,
        hashlib.sha256,
    ).hexdigest()
    # 3. Constant-time compare
    received = signature_header.removeprefix("sha256=")
    return hmac.compare_digest(expected, received)
Важно: Считайте HMAC от raw bytes тела запроса, а не от re-serialized JSON. Любое изменение форматирования нарушит проверку.

Тарифы

Webhooks доступны с плана Business

ТарифДоступАктивных endpoints
Free
Starter
Pro
Business3
Business Pro10

Частые вопросы

Не нашли ответ? Напишите нам

Что произойдёт, если мой сервер вернёт 500?
TenderPulse повторит доставку по расписанию: сразу → +5 сек → +5 мин → +30 мин → +2 ч → +5 ч. Итого 6 попыток. Если все 6 вернут не-2xx, событие помечается как «failed» — вы можете сделать ручной replay из раздела доставок после того, как исправите сервер. После 5 подряд неудачных событий endpoint автоматически переходит в статус «disabled».
Как долго хранятся доставки?
История доставок доступна постранично: по 50 записей, с пагинацией через параметры limit и offset. Старые записи не удаляются принудительно — они остаются в логе для отладки и повторной доставки.
Можно ли отключить отдельный тип события?
Да. При создании endpoint укажите нужные event_types (например, только tender.analyzed). Тип webhook.test срабатывает только по явному вызову из дашборда. Изменить набор типов после создания можно через PATCH /api/webhooks/{id}.
Что если секрет утёк?
Вызовите POST /api/webhooks/{id}/rotate-secret — старый секрет немедленно инвалидируется, новый возвращается в ответе один раз. Все следующие события будут подписаны новым секретом. Никогда не публикуйте signing_secret в логах, телеметрии или репозиториях.
Поддерживаете ли HTTPS endpoints с self-signed сертификатом?
Нет. TenderPulse требует валидный TLS-сертификат от доверенного УЦ. HTTP и self-signed cert отклоняются на этапе создания endpoint. Это требование нельзя обойти — оно защищает ваши данные в transit.
Можно ли получать события для другого пользователя?
Нет. Webhook endpoint привязан к user_id создателя. События доставляются только по действиям этого пользователя. Члены команды с другим аккаунтом создают собственные endpoint-ы.

Готовы попробовать?

Подключите webhook за несколько минут — endpoint, секрет и первая доставка.

Cookies и персональные данные

Мы используем cookies для работы авторизации и сохранения настроек. Дополнительно — обезличенная аналитика использования. Подробнее в политике конфиденциальности.