Webhooks

Receba notificações quando um novo rascunho estiver pronto — depois busque o artigo completo via API.

Configure URL de webhook e secret em Integrações. Quando um rascunho fica pronto, enviamos article.ready com slug e dicas de fetch. Seu backend verifica HMAC e chama GET /posts/{slug} para importar contentHtml.

Eventos

  • article.ready — Um rascunho ficou pronto com pontuação de qualidade — busque o HTML completo via API usando o slug
  • webhook.test — Enviado ao chamar POST /api/v1/webhooks/test

Verificação de assinatura

Enviamos X-GrowthDaily-Timestamp (segundos Unix) e X-GrowthDaily-Signature (HMAC-SHA256 hex de `{timestamp}.{rawBody}` usando seu secret de webhook).

Verificar a assinatura (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);
}
Payload de 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"
  }
}

Após article.ready

Use o slug do payload (ou fetch.path) para chamar GET /api/v1/sites/{siteId}/posts/{slug}. Importe contentHtml, seo e faqJsonLd no CMS — publique no seu cronograma.

Garantias de entrega

Cada evento é enviado uma vez com POST HTTP e timeout de 8 segundos. Não repetimos entregas falhadas automaticamente. Um webhook falhado não bloqueia novos rascunhos. Cada tentativa aparece em Integrações → Entregas recentes.

Handlers idempotentes

Responda com HTTP 2xx rapidamente. Deduplique importações com postId (ou siteId + slug). Se perder um evento, use GET /posts com updatedAfter — veja a referência da API.

Log de entregas

Sucesso e falha aparecem no painel de integrações com status HTTP e horário.