Beta . Ortha CMS is in public beta. Every plan is free until it ends.
Get started
Menu

Delivery · 18 / 23

Webhooks

A signed POST to your endpoint when content changes, retried until it lands, with every attempt in a delivery log.

WebhooksRebuild the storefront Send test Edit
DeliveriesSettings
Rebuild the storefront
Active https://shop.example.com/hooks/orthacms
Succeeded, last 50
96%98%
Delivered
4849
Failed
21
Median response
184 ms
Last delivery
this minute
214 deliveries All states

Today

entry.published article 503 503 · 2 tries 200 · 3 tries 04:04 PM
entry.updated article 200 04:02 PM
entry.created article 200 03:58 PM
ping 204 03:40 PM

Yesterday

entry.unpublished article 410 06:12 PM
entry.published Retrying Delivered Sep 27, 2026, 4:04 PM · attempt 1 · 503 in 87 ms2 attempts · 503 in 91 ms3 attempts · 200 in 184 ms Send again
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

  1. 01

    Add an endpoint and choose the events and content types it receives.

  2. 02

    Each delivery is signed with HMAC SHA-256.

  3. 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.

Each receiver has its own deliveries and retry schedule.

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-Signature is 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.

Full reference in the docs