FixVibe

// docs / webhooks

Webhooks

FixVibe отправляет подписанные исходящие веб-перехватчики для завершения сканирования, сбоев терминала, важных результатов, оповещений монитора в реальном времени и запланированных запусков. Доставка осуществляется хотя бы один раз и повторяется в течение примерно 24 часов.

Setup

Откройте Account → Webhooks, создайте конечную точку HTTPS и сохраните одноразовый секрет whsec_ в своем приемнике. Вебхуки доступны на платных планах.

  1. Создайте конечную точку из Account → Webhooks.
  2. Выберите, какие события FixVibe должны отправлять в эту конечную точку.
  3. Немедленно скопируйте секрет; он отображается один раз, и его можно повернуть только позже.

Events

Поверхность событий запуска охватывает моменты, когда команды обычно подключаются к CI, оповещениям или выдаче билетов:

  • scan.completed — срабатывает, когда сканирование переходит к completed. Полезная нагрузка: идентификатор сканирования, цель, режим, количество сегментов серьезности, ссылка на отчет.
  • scan.failed — уведомление о сбое терминала. Полезная нагрузка: идентификатор сканирования, причина сбоя и ссылка на отчет, если она доступна.
  • finding.created — излучается за критическое или высокое значение. Более низкие уровни серьезности по умолчанию сворачиваются в scan.completed, чтобы избежать спама о событиях.
  • monitor.alert.fired — срабатывает в плане Unlimited, когда журналы прозрачности сертификатов, записи DNS или базы данных анализа угроз обнаруживают изменения.
  • schedule.run.queued — срабатывает, когда планировщик ставит в очередь повторное сканирование. Полезно для оркестровки CI.

Форма полезной нагрузки

В каждой доставке используется один и тот же конверт: <code>id</code>, <code>type</code>, <code>created_at</code> и <code>data</code> для конкретного события.

json
{
  "id": "8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d",
  "type": "scan.completed",
  "created_at": "2026-05-15T10:20:30.000Z",
  "data": {
    "scan": {
      "id": "8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d",
      "target_hostname": "staging.example.com",
      "mode": "passive",
      "status": "completed",
      "findings_count": { "critical": 0, "high": 1, "medium": 2, "low": 3, "info": 4 },
      "report_url": "https://fixvibe.app/dashboard/scans/8f1c4e2a-..."
    }
  }
}

Signing

FixVibe подписывает точное необработанное тело JSON HMAC-SHA-256. Проверьте подпись, прежде чем анализировать или доверять данным о событии. Заголовки:

  • fixvibe-signature: t=<timestamp>,v1=<hex hmac>
  • fixvibe-event: scan.completed
  • fixvibe-delivery: <uuid> (ключ идемпотентности)
ts
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(rawBody: string, header: string, secret: string) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const signed = `${parts.t}.${rawBody}`;
  const expected = createHmac("sha256", secret).update(signed).digest("hex");
  const received = Buffer.from(parts.v1 ?? "", "hex");
  const calculated = Buffer.from(expected, "hex");
  return received.length === calculated.length && timingSafeEqual(received, calculated);
}

Retries

Любой ответ, отличный от 2xx, тайм-аут, сбой DNS или отказ в обеспечении безопасности доставки повторяются с экспоненциальной задержкой в течение примерно 24 часов. В строках доставки отображается статус ответа, краткий отрывок ответа, количество попыток и состояние недоставленных писем в разделе «Учетная запись» → «Вебхуки».