← All integrations
Webhook
POST signed JSON to any URL when an article ships.
Setup
- Go to Settings → Integrations and add a webhook URL.
- We'll generate a bearer token and HMAC secret for you.
- 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>.