POST with a JSON body and two custom headers:| Field | Type | Description |
|---|---|---|
id | UUID v4 | Unique delivery id. Stable across Oban retries — use it for idempotency. |
event_name | string | Event identifier (e.g. participant_created). |
sent_at | ISO 8601 UTC | Moment the CMS enqueued the delivery. Use it for replay protection. |
data | object | Event payload. Shape depends on event_name. |
| Header | Description |
|---|---|
x-omerlo-webhook-signature | Base64-encoded Ed25519 signature over the raw request body. |
x-omerlo-webhook-key-id | Identifier of the signing key (currently v1). Lets the CMS rotate keys without breaking consumers. |
GET https://<cms-host>/.well-known/omerlo-webhook-public-key{
"algorithm": "ed25519",
"keys": [
{ "id": "v1", "public_key": "<base64-encoded 32-byte Ed25519 public key>" }
]
}401 response. Thekeys array is plural so additional keys can appear during a rotation window.x-omerlo-webhook-key-id header.x-omerlo-webhook-signature header.(public_key, raw_body, signature).sent_at is older than 5 minutes (replay protection).id was already processed (idempotency).2xx once the event is safely persisted; any other status