Webhooks
Receiving AccelerUp events in your own systems, and sending events into AccelerUp.
Outbound — AccelerUp calls you
Add a webhook notification channel with a URL and an optional signing secret. Every matching event is POSTed to it as JSON.
Payload
{
"event": "alert.fired",
"org_id": "…",
"alert_id": "…",
"title": "Checkout error rate above 2%",
"body": "error_pct is 3.41 (threshold > 2) — Clickhouse",
"severity": "high",
"service": "checkout-api",
"environment": "production",
"url": "https://monitoring.qrdev.org/alerts/…",
"timestamp": "2026-09-15T08:14:02Z"
}Events
| Event | When |
|---|---|
alert.fired | A condition became true and cleared For |
alert.resolved | It became false and cleared Recovery |
alert.acknowledged | Somebody claimed it |
incident.opened / .updated / .resolved | Incident lifecycle |
deployment.started / .finished | See Delivery |
test | The Test button |
Verifying the signature
When a secret is set, the request carries an HMAC-SHA256 of the raw body.
import hmac, hashlib
def verify(raw_body: bytes, header: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)Verify against the raw body, before any JSON parsing. Re-serialising changes the bytes and the signature will never match.
Delivery and retries
Webhook deliveries are logged and retried exactly like every other channel — three retries at 1, 5 and 30 minutes, then the DLQ. See Notification delivery.
Return 2xx quickly. A slow endpoint is recorded as a failure and retried; do
the work asynchronously on your side.
Inbound — you call AccelerUp
Several integrations accept events into AccelerUp:
| Endpoint | Sender |
|---|---|
POST /api/v1/jenkins/notify | Jenkins, for real-time build status |
POST /api/v1/deployments/webhook | Any CI system, to record a deployment |
POST /api/v1/alerts/webhook | External monitoring, to raise an alert |
Each is authenticated by a token issued in the relevant settings page. See Jenkins and Deployment setup.
Where this behaviour lives: backend/internal/notification/webhook_client.go, backend/internal/integration/inbound.go. If the code and this page disagree, the code is right — please fix the page.
Part of Reference — The exact numbers, names and limits, generated from the code.