Webhooks

Reciba notificaciones cuando un nuevo borrador esté listo — luego obtenga el artículo completo vía API.

Configura una URL de webhook y un secreto en Integraciones. Cuando un borrador está listo, enviamos article.ready con slug e indicaciones de fetch. Tu backend verifica HMAC y llama a GET /posts/{slug} para importar contentHtml.

Eventos

  • article.ready — Hay un borrador con control de calidad listo — obtén el HTML completo vía API usando el slug
  • webhook.test — Enviado al llamar a POST /api/v1/webhooks/test

Verificación de firma

Enviamos X-GrowthDaily-Timestamp (segundos Unix) y X-GrowthDaily-Signature (HMAC-SHA256 hex de `{timestamp}.{rawBody}` usando su secreto de webhook).

Verificar la firma (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);
}
Carga 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"
  }
}

Después de article.ready

Use el slug del payload (o fetch.path) para llamar a GET /api/v1/sites/{siteId}/posts/{slug}. Importe contentHtml, seo y faqJsonLd en su CMS — publique según su calendario.

Garantías de entrega

Cada evento se envía una vez con un POST HTTP y un tiempo de espera de 8 segundos. No reintentamos entregas fallidas automáticamente. Un webhook fallido no bloquea nuevos borradores. Cada intento queda en Integraciones → Entregas recientes.

Manejadores idempotentes

Responde con HTTP 2xx rápido. Deduplica importaciones con postId (o siteId + slug). Si pierdes un evento, consulta GET /posts con updatedAfter — ver referencia API.

Registro de entregas

Éxito y error aparecen en el panel de integraciones con estado HTTP y marca de tiempo.