1. Webhooks
Backoffice API
  • AdOps
  • Assets
    • Upload Asset Image
      POST
    • Get Asset by id
      GET
  • Community
  • Core
  • Docs
  • Magazines
  • Messenger
    • SES
      • SES Webhook for mail events
    • Mailinglists
      • Paginated subscriptions by mailinglist id
  • Publisher
    • BlockConfigs
      • All Block Configurations
      • Create Block Configuration
      • Get Block Configuration by id
      • Update Block Configuration by id
    • Blocks
      • Create Media Block HTML
      • Media Block by id
      • Update Media Block HTML by id
    • Publications
      • Create Publication
      • Publication by id
      • Remove Publication by id
  • ReaderHub
    • Readers
      • Create Reader entitlement
    • SES
      • SES Webhook for mail events
    • Mailinglists
      • Paginated subscriptions by mailinglist id
      • Subscribe by mailinglist id
  • Webhooks
    • Webhook Security
    • Events
      • Event Invitation Created
      • Participant Created
      • Participant Removed
  • Schemas
    • AdOps
      • Ad
      • Adversiter
      • Category
      • Creative
      • Adversiter (summary)
    • Community
      • Event
      • Event (summary)
      • Event Schedule
      • Organization
      • Organization (summary)
      • Person
      • Person (summary)
      • Project
      • Project (summary)
      • Profile
      • Profile (summary)
      • Profile Address
      • Profile Block
      • Profile Block (summary)
      • Profile BlockEntry
      • Profile BlockEntry (summary)
      • Profile Contact
      • Profile Description
      • Profile Metadata
    • Core
      • Visual
        • Image
        • Slideshow
        • Video
        • Visual Image
        • Visual Slideshow
        • Visual Video
        • Visual None
      • Asset
      • Category
      • Reference
      • Paging Metadata
      • Visual
    • Docs
      • Content
        • Content
        • Content (summary)
        • Content Metadata
        • Content Block
      • Blocks
        • Quote Block
        • Question Block
        • Data Block
        • HTML Block
        • Image Block
        • Related Content Block
        • Profiles Block
        • Richtext Block
        • Slideshow Block
        • Video Block
      • ContentType
        • ContentType
        • ContentTemplate (summary)
        • ContentTemplate
    • Magazines
      • Issue
      • Section
      • Section Block
      • Section Block (summary)
      • Block Slot
      • SectionContent
    • Publisher
      • Publication
      • Reader subscription (summary)
      • Media Block Configuration (summary)
      • Media Block Configuration
    • ReaderHub
      • Entitlement
  1. Webhooks

Webhook Security

Webhooks#

Omerlo CMS delivers events (participant created, event deleted, …) to external
endpoints registered via the backoffice. Every delivery is signed with Ed25519
so consumers can confirm the request originated from the CMS and was not
tampered with in transit.

Delivery format#

Every webhook is a POST with a JSON body and two custom headers:
FieldTypeDescription
idUUID v4Unique delivery id. Stable across Oban retries — use it for idempotency.
event_namestringEvent identifier (e.g. participant_created).
sent_atISO 8601 UTCMoment the CMS enqueued the delivery. Use it for replay protection.
dataobjectEvent payload. Shape depends on event_name.
HeaderDescription
x-omerlo-webhook-signatureBase64-encoded Ed25519 signature over the raw request body.
x-omerlo-webhook-key-idIdentifier of the signing key (currently v1). Lets the CMS rotate keys without breaking consumers.

Public key distribution#

The active public key is served as JSON at:
GET https://<cms-host>/.well-known/omerlo-webhook-public-key
{
  "algorithm": "ed25519",
  "keys": [
    { "id": "v1", "public_key": "<base64-encoded 32-byte Ed25519 public key>" }
  ]
}
Cache it locally (5 minutes is fine) and refresh on a 401 response. The
keys array is plural so additional keys can appear during a rotation window.

Verifying a delivery#

A consumer MUST:
1.
Capture the raw request body (bytes received on the wire). Do not
re-serialize a parsed JSON object — key ordering and whitespace would
differ and the signature would no longer match.
2.
Look up the public key matching the x-omerlo-webhook-key-id header.
3.
Base64-decode the x-omerlo-webhook-signature header.
4.
Run Ed25519 verification over (public_key, raw_body, signature).
5.
Reject if sent_at is older than 5 minutes (replay protection).
6.
Skip work if id was already processed (idempotency).
7.
Respond with 2xx once the event is safely persisted; any other status
triggers an Oban retry.
Modified at 2026-06-29 05:25:01
Previous
Subscribe by mailinglist id
Next
Event Invitation Created
Built with