Webhooks

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

Настройте URL webhook и secret в Интеграциях. Когда черновик готов, мы отправляем article.ready со slug и подсказками для fetch. Ваш backend проверяет HMAC и вызывает GET /posts/{slug} для импорта contentHtml.

События

  • article.ready — Черновик прошёл проверку качества — получите полный HTML через API по slug
  • webhook.test — Отправляется при вызове POST /api/v1/webhooks/test

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

Мы отправляем X-GrowthDaily-Timestamp (Unix-секунды) и X-GrowthDaily-Signature (hex HMAC-SHA256 от `{timestamp}.{rawBody}` с вашим webhook secret).

Проверка подписи (Node.js)
import { createHmac, timingSafeEqual } from "crypto";

function verify(secret, rawBody, timestamp, signatureHex) {
  const expected = createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex");
  const a = Buffer.from(expected, "utf8");
  const b = Buffer.from(signatureHex, "utf8");
  if (a.length !== b.length) return false;
  return timingSafeEqual(a, b);
}
Тело события article.ready
{
  "event": "article.ready",
  "siteId": "uuid",
  "postId": "uuid",
  "slug": "my-post",
  "title": "My post",
  "trustScore": 94,
  "qualityBand": "premium",
  "assuranceLabel": "High confidence",
  "language": "en",
  "sourcePostId": null,
  "status": "draft",
  "at": "2026-07-21T12:00:00.000Z",
  "fetch": {
    "path": "/api/v1/sites/{siteId}/posts/{slug}",
    "hint": "GET with Bearer token to import contentHtml"
  }
}

После article.ready

Используйте slug из payload (или fetch.path) для вызова GET /api/v1/sites/{siteId}/posts/{slug}. Импортируйте contentHtml, seo и faqJsonLd в CMS — публикуйте по своему расписанию.

Гарантии доставки

Каждое событие отправляется один раз HTTP POST с таймаутом 8 секунд. Неудачные доставки автоматически не повторяются. Сбой webhook не блокирует новые черновики. Все попытки — в Интеграции → Последние доставки.

Идемпотентные обработчики

Быстро отвечайте HTTP 2xx. Дедуплицируйте импорт по postId (или siteId + slug). Если пропустили событие — GET /posts с updatedAfter, см. справочник API.

Журнал доставки

Успех и ошибка видны в панели интеграций с HTTP-статусом и временем.