Custom webhook integration

Connect Auto SEO to Custom webhook

If your CMS isn't natively supported yet, the webhook integration covers it. Auto SEO POSTs a JSON payload for each article; your endpoint does the rest.

  1. 1

    Create an HTTPS endpoint

    Any framework or platform works — Next.js Route Handler, Express, Cloudflare Worker, Lambda, even a tiny Cloud Function. It needs to accept POST and return 2xx on success.

  2. 2

    Set the shared secret

    Pick a strong random string. Put it in your env as AUTOSEO_WEBHOOK_SECRET. Add it to the Auto SEO dashboard under Integrations → Webhook.

  3. 3

    Verify the signature on every request

    Auto SEO sends an x-autoseo-signature header (HMAC-SHA256 of the raw body). Reject any request whose signature doesn't match — never trust the payload alone.

  4. 4

    Persist the article

    Write the body into your CMS, content folder, or queue. Return 200 with a small JSON body — Auto SEO records the response for diagnostics.

  5. 5

    Handle retries

    Non-2xx responses retry with exponential backoff (5s, 30s, 5m, 30m, 6h). If you need to pause processing during a deploy, return 503 and Auto SEO will retry until success.

Example payload / snippet

Example payload

{
  "event": "article.published",
  "id": "art_01HZX...",
  "slug": "ai-seo-2026-guide",
  "language": "en",
  "title": "How AI is changing SEO in 2026",
  "summary": "A field guide to the new ranking signals.",
  "body_html": "<p>Long-form article body…</p>",
  "body_md": "## Section one…",
  "hero_image_url": "https://cdn.autoseo.it.com/hero/…",
  "tags": ["ai-seo", "automation"],
  "seo": {
    "meta_title": "How AI is changing SEO in 2026",
    "meta_description": "A field guide to the new ranking signals.",
    "canonical": null
  },
  "schema_jsonld": { "@context": "https://schema.org", "@type": "Article", "…": "…" },
  "published_at": "2026-05-18T10:00:00Z"
}

Signature verification

// Node.js example
import crypto from "node:crypto";
const sig = req.headers.get("x-autoseo-signature");
const body = await req.text(); // raw body before parsing
const expected = crypto
  .createHmac("sha256", process.env.AUTOSEO_WEBHOOK_SECRET)
  .update(body)
  .digest("hex");
if (sig !== expected) return new Response("Forbidden", { status: 403 });

What gets published

  • Full article body in HTML and Markdown so you can pick the format your stack wants.
  • Hero image URL (CDN-hosted with cache headers).
  • SEO bundle: meta title, meta description, canonical, OG image.
  • Schema.org JSON-LD blocks ready to inject into the page.
  • Tag and category suggestions inferred from the topic cluster.

Troubleshooting

Most webhook failures come from signature mismatches: make sure you're hashing the RAW body bytes, not the parsed JSON. If you proxy through a CDN, allow the x-autoseo-signature header to pass through unchanged. You can replay the last 50 deliveries from the integration dashboard.

Slug: webhook