Ranket ships every article to your CMS through a single signed HTTP webhook. There’s no CMS plugin to install. Any system that can receive a JSON POST works.
What you’ll need
- A public HTTPS endpoint that accepts
POSTrequests - The ability to verify an HMAC SHA-256 signature on the body
- Logic to map our payload into a published post in your CMS
That’s it. The full payload spec, signature verification, and code examples are in webhooks.
The 60-second setup
- Go to brand settings → CMS webhooks
- Click “Add endpoint”
- Paste your endpoint URL (e.g.
https://your-site.com/api/ranket-webhook) - Copy the signing secret Ranket generates — it’s shown ONCE
- Click “Send test” to receive a sample payload
If your receiver returns a 2xx, you’re done. If it fails, the dashboard shows the response body so you can debug.
What the payload looks like
{
"event": "article.published",
"delivery_id": "evt_a1b2c3...",
"timestamp": "2026-05-15T09:00:00Z",
"brand": {
"id": "uuid",
"domain": "your-site.com"
},
"article": {
"title": "...",
"slug": "...",
"metaTitle": "...",
"metaDescription": "...",
"excerpt": "...",
"bodyMarkdown": "...",
"bodyHtml": "...",
"faq": [{ "question": "...", "answer": "..." }],
"images": [{ "url": "...", "alt": "...", "position": "hero" }],
"externalLinks": [...],
"internalLinks": [...],
"jsonLd": { "@context": "...", "@graph": [...] },
"meta": {
"ogTitle": "...",
"twitterCard": "summary_large_image",
"readTimeLabel": "8 min read",
...
},
"wordCount": 3200,
"readTimeMinutes": 16
}
}
Most CMSes only need a fraction of these fields. Markdown body + title + slug + hero image is enough to publish.
Per-CMS recipes
- WordPress receiver (coming soon)
- Webflow CMS API (coming soon)
- Ghost Admin API (coming soon)
- Sanity content lake (coming soon)
- Custom receiver template (coming soon)
Until those are written, the webhook contract is enough to roll your own in any language.
Multiple endpoints per brand
You can register more than one endpoint per brand — useful if you want one webhook to publish to your CMS and another to ping a Slack channel or Notion log.
Each endpoint gets its own secret, retry policy, and delivery log. Disabling an endpoint pauses deliveries to it without losing history.
What happens on failure
If your endpoint returns non-2xx (or times out at 30 seconds):
- Delivery is logged with the response status + body
- Automatic retry at 1 minute, then 5 minutes, then 30 minutes
- After 3 failed retries, the delivery is marked
failedand surfaces in the dashboard - The article itself stays
readyand can be redelivered manually
Failed deliveries don’t block subsequent articles — each one is a separate delivery attempt.
Idempotency
Every delivery includes a unique delivery_id header (X-Ranket-Delivery-Id) and body field. If your receiver retries a webhook that already succeeded (which can happen on network blips), use this ID to deduplicate.
We never re-issue a delivery_id. Two POSTs with the same ID = same event.
Skipping the webhook (manual export)
If you don’t want autopilot:
- In review mode, you approve articles one at a time
- Each approved article is downloadable as Markdown + JSON-LD + image bundle (zip) from the dashboard
- The webhook still fires if configured, but you can skip it and copy/paste
This is the migration-path approach for users who want to evaluate output quality before automating delivery.