Skip to main content
Webhook endpoints are project resources. A write-capable token can list, create, and update them; deletion requires admin access. Personal-token access is also capped by the user’s project membership role. A project can have at most 10 endpoints. Existing projects above the cap can keep and update their endpoints, but must delete endpoints before creating another. Every webhook-channel rule fans out to every enabled endpoint in its project. Endpoints are not selected per rule and do not have event filters. 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.

Event envelopes

All outbound bodies are JSON objects with event, createdAt, and data. There are three event names.

alert.fired

A test delivery uses this same envelope and posting path, with data.test: true and representative values. Production alert deliveries omit test.

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.

Verify signatures

Each request has:
  • X-Bisibility-Timestamp: Unix seconds.
  • X-Bisibility-Signature: sha256=<hex digest>.
The digest is HMAC-SHA256 over the exact UTF-8 signing string `${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 through event === "alert.fired" and data.test === true. 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.