earlyseo
← All integrations

Webhook

POST signed JSON to any URL when an article ships.

Setup

  1. Go to Settings → Integrations and add a webhook URL.
  2. We'll generate a bearer token and HMAC secret for you.
  3. Click Test to fire a probe payload — verify it lands on your endpoint.

Payload

POST <your-webhook-url>
Content-Type: application/json
Authorization: Bearer <bearer-token>
X-Earlyseo-Signature: <hex-digest>

{
  "event": "article.published",
  "siteId": "<uuid>",
  "article": {
    "id": "<uuid>",
    "title": "...",
    "slug": "...",
    "metaDescription": "...",
    "contentRawHtml": "...",
    "contentCss": "...",
    "tags": [],
    "publishedAt": "2026-05-08T07:00:00Z"
  }
}

Verify the signature

// Next.js receiver
import crypto from "crypto";

export async function POST(req) {
  const body = await req.text();
  const sig = req.headers.get("x-earlyseo-signature");
  const expected = crypto
    .createHmac("sha256", process.env.EARLYSEO_HMAC_SECRET)
    .update(body)
    .digest("hex");
  if (sig !== expected) return new Response("invalid", { status: 401 });
  // ...
}

FAQ

How is the payload signed?

We sign the raw JSON body with HMAC-SHA256 using the per-integration hmac_secret and pass the hex digest in x-earlyseo-signature.

What's the retry policy?

On non-2xx responses we exponentially back off — 60s × 2^attempt — up to 10 attempts before marking the delivery exhausted.

Can I use my own bearer token?

Yes. Provide one when creating the integration; we'll send it as Authorization: Bearer <your-token>.