Skip to main content
The webhook connector POSTs a JSON payload to a URL you control whenever an article is published. Use it for a headless CMS, a static site generator, an internal review queue, or any CMS we don’t support natively.

Step 1 — Have an endpoint ready

You need a URL that accepts POST with a JSON body and answers with a 2xx status. Anything outside 200–299 counts as a failed delivery.
The endpoint must be reachable from the public internet. localhost works only while you are testing against a local SeoSorted install.

Step 2 — Connect

Project Settings → Integrations → Webhook → Connect.
Connect Webhook dialog with fields for Endpoint URL, Signing secret and Description

The webhook connect form

string
required
Where we POST, for example https://api.yourapp.com/seosorted/articles.
string
Optional. At least 16 characters. Leave it blank and we generate one for you — the usual choice.
string
Optional label for your own reference, e.g. “Production blog publisher”.
A secret shorter than 16 characters is rejected before anything is saved:
Connect Webhook dialog showing the error: a signing secret must be at least 16 characters

Short secrets are caught up front

Step 3 — Save the signing secret

If we generated the secret, it is shown once, immediately after connecting.
Webhook connected panel showing the generated whsec_ signing secret with a Copy button

Copy the signing secret — it is shown once

Store it in your app’s secret manager before clicking Done. We keep it encrypted and cannot show it again. Lost it? Reconnect the webhook to generate a new one, then update your endpoint.

Step 4 — Send a test delivery

The connected card has a Send test button. It posts a test event with a realistic payload and tells you exactly what your endpoint replied.
Webhook card showing Send test and Disconnect buttons, with the endpoint URL and last synced time

Send test posts a sample payload and reports the response

You’ll see one of:

Step 5 — Publish

Publish an article and choose Webhook. Because a webhook has no public URL to link to, success is confirmed in place.
Publish dialog showing Published and the message Delivered to your webhook endpoint

A webhook publish confirms delivery

Verifying the signature

Every request carries these headers: The signature is an HMAC-SHA256 of <t>.<raw request body> keyed with your signing secret, where t is the Unix timestamp in the same header.
Compute the HMAC over the raw request body, before any JSON parsing. Re-serializing the parsed object changes the bytes and the signature will never match.

Delivery behaviour

  • Timeout: 15 seconds. Reply quickly and do the slow work asynchronously.
  • Retries: deliveries are attempted once. A failure is recorded with the response status, body and error so you can see what happened.
  • Health: after 5 failed deliveries within an hour, the connector is marked Error on the Integrations tab.
  • Duplicates: use X-SeoSorted-Delivery as an idempotency key.
See the payload reference for the exact JSON body.