Create request:
hmac_secret is required on create, optional on patch, non-null, at least 16
characters, and write-only. It is encrypted at rest and is never returned.
Omit it on patch to keep the current secret, or send a non-empty value to
rotate. Sending null or "" is a validation error.
Every endpoint response has this exact shape:
Failed attempts do not change
last_delivery_at. Private-network and loopback
targets are rejected by default. Self-hosters who deliberately need them can
set WEBHOOK_ALLOW_PRIVATE_NETWORK=1 after reviewing the SSRF implications;
see Webhook SSRF and private-network delivery.
Event envelopes
All outbound bodies are JSON objects withevent, created_at, data, and
schemaVersion. There are four event names, and every current envelope uses
schema version 3. Every resource ID in data is a strict v3 public ID; raw
database and Temporal identifiers never cross this boundary.
alert.fired
data. Version 3 establishes the final public-ID prefix contract; a future
semantic change requires a schemaVersion bump. It intentionally has no event
or delivery ID.
A test delivery uses the webhook.test envelope below on the same signed
posting path.
alert.digest
data.alerts contains full alert.fired.data objects. Webhook batches contain
at most 200 alerts and are not shortened.
alert.daily_cap_reached
This notice is sent once when a rule exhausts its daily delivery-batch budget.
webhook.test
Sent by Send test event. It carries no alert data.
webhook_id identifies the endpoint the test was sent to.
Verify signatures
Each request has:X-Bisibility-Timestamp: Unix seconds.X-Bisibility-Signature:sha256=<hex digest>.
`${timestamp}.${body}`, where body is the raw request body before JSON
parsing. Reject timestamps outside a 300-second window to prevent replay.
Test and delivery behavior
In the endpoint list, select Send test event. A successful result shows the HTTP status and latency. A failure also shows the concrete reason. The receiver can identify the signed test throughevent === "webhook.test".
Each request has a 10-second timeout and redirects are not followed. HTTP 4xx
responses are permanent except 408 and 429. Network errors, 408, and 5xx
responses are retryable. Webhook delivery makes at most five attempts: the
first attempt, then exponential retries after about 10, 20, 40, and 80 seconds.
For 429, Retry-After accepts delta-seconds or an HTTP date. A missing, invalid,
non-positive, or expired 429 value uses 60 seconds. The requested delay is
capped at 10 minutes. This 60-second default applies only to 429, not to generic
5xx backoff.