Delivery · 18 / 23
Webhooks
A signed POST to your endpoint when content changes, retried until it lands, with every attempt in a delivery log.
- Succeeded, last 50
- 96%98%
- Delivered
- 4849
- Failed
- 21
- Median response
- 184 ms
- Last delivery
- this minute
Today
Yesterday
- POST
- https://shop.example.com/hooks/orthacms
- Event id (deduplicate on this)
- 5c0e91d2-7a4f-4e1b-9c2d-0b8f6e3a1d47
- Delivery id
- 0a1f7c3e-52b8-4d0e-a6f1-93c47e2b18d5
{
"id": "0a1f7c3e-52b8-4d0e-a6f1-93c47e2b18d5",
"data": {
"id": "e41f0a2b-6c3d-4f8e-b1a7-2d95c0e7f314",
"kind": "content_entry",
"title": "The quiet return of night trains",
"contentType": "article"
},
"actor": {
"id": "7b2e94c1-0f3a-4d6b-8e5c-1a9f2d7c4b60",
"email": "mara@newsroom.example"
},
"event": "entry.published",
"eventId": "5c0e91d2-7a4f-4e1b-9c2d-0b8f6e3a1d47",
"occurredAt": "2026-09-27T16:04:11.000Z",
"workspaceId": "3c1e5a0b-7d2f-4a96-b0e8-5f1c3d9a2e74"
} - HTTP status
- 200
- Took
- 184 ms
{"ok":true,"build":"queued"} How it works
- 01
Add an endpoint and choose the events and content types it receives.
- 02
Each delivery is signed with HMAC SHA-256.
- 03
A failure is retried with backoff — six attempts over about two and a half hours.
- Signature
- X-Orthacms-Signature
- Deduplicate on
- X-Orthacms-Event-Id
- Log
- 30 days of deliveries
In depth · For the engineer wiring up the site
Know when content changes
Rebuild a site, refresh a search index or purge a cache the moment an entry changes — with every delivery signed, retried and logged.
Sent from a queue, never from a save
A content change writes one delivery row per matching endpoint. A separate worker sends it, so a slow or broken receiver never delays an editor’s save — and costs only its own deliveries.
Under the hood
The queue and the delivery log are the same table, so the admin shows every attempt with its status and a Send again button.
The delivery table in the middle, with four receivers docked into it, each subscribed to different event kinds.
Eight event kinds
Show the table
| Kind | When it fires |
|---|---|
| entry.created | A new record was saved as a draft. |
| entry.updated | A record’s values changed. |
| entry.published | A record went live. |
| entry.unpublished | A live record went back to draft. |
| entry.deleted | A record moved to the trash. |
| entry.restored | A record came back from the trash. |
| entry.purged | A record was permanently removed. |
| ping | Sent by the "Send test" button. |
What a receiver can rely on
- Filter by workspace, event and type
- An empty filter means everything, including workspaces and types added later.
- Signed and replay-proof
X-Orthacms-Signatureis an HMAC-SHA256 over a timestamp and the raw body.- At-least-once
- Deduplicate on
X-Orthacms-Event-Id, which stays the same across retries. - Six attempts over 2.5 hours
- Retried with jittered backoff; a 4xx other than 408 and 429 is final.
- References, not field values
- The receiver reads the entry through the delivery API, so access rules still apply.
- Safe by default
- HTTPS only, and private and metadata addresses are refused unless you allow them.
Questions
Is this a message bus?
No. It is one HTTP POST per event per endpoint, at-least-once and unordered. Right for rebuilds and cache purges; wrong for strict ordering.
Can I send to a receiver inside my own network?
Yes, once you turn private networks on in configuration. They are refused by default.