These docs are in English. If you prefer German, write us at beta@clickprobe.ai.
Webhooks
Webhooks let ClickProbe notify your external systems — Slack, Microsoft Teams, Discord, or any HTTPS endpoint — when events occur in your account.
Creating a webhook
- Go to Webhooks in the top navigation bar.
- Click New webhook.
- Paste your endpoint URL (e.g. a Slack Incoming Webhook URL).
- Select the events you want to receive (see Event reference below).
- Optionally scope the webhook to a specific project (leave as “All projects” for account-wide delivery).
- Click Create webhook.
Important: The signing secret is shown once immediately after creation. Copy it to your password manager. ClickProbe cannot show it again.
Provider-specific notes
| Provider | URL pattern | Notes |
|---|---|---|
| Slack | hooks.slack.com/services/… | Uses Block Kit attachments. Severity is color-coded (red/orange/blue). Requires a “Slack App” with “Incoming Webhooks” enabled. |
| Teams | *.webhook.office.com/webhookb2/… | Uses Adaptive Card format (schema v1.4). |
| Discord | discord.com/api/webhooks/… | Uses embed format with color codes. |
| Generic | Any HTTPS URL | Receives the canonical JSON envelope (see below). |
Event reference
| Event | When fired |
|---|---|
bug.created | A new bug is mirrored from the proxy |
bug.confirmed | A bug is moved to “confirmed” status |
bug.retesting | A retest session is queued for a bug |
bug.exported | A bug is exported to an issue tracker |
bug.resolved | A bug is marked resolved / won’t-fix / duplicate (dashboard, or clickprobe.resolve_bug from an IDE agent) |
bug.annotated | A free-text note is appended to a bug (clickprobe.annotate_bug) |
bug.pr_linked | A pull/merge request URL is attached to a bug (clickprobe.link_pr) |
session.started | An exploration session begins |
session.completed | A session ends with status “completed” |
session.failed | A session ends with status “failed” or “crashed” |
budget.alert_50 | Monthly spend reaches 50% of the cap |
budget.alert_80 | Monthly spend reaches 80% of the cap |
budget.exhausted | Monthly budget cap is reached |
Payload format
Every delivery has a canonical envelope:
{
"event": "bug.created",
"data": {
"bug_id": "abc-123",
"severity": "critical",
"title": "[critical] Something is broken",
"page_url": "https://app.example.com/dashboard",
"session_id": "sess-456",
"project_id": "proj-789",
"app_url": "https://app.clickprobe.ai/app/bugs/abc-123"
},
"timestamp": "2026-04-21T09:30:00.123456+00:00"
}
Slack, Teams, and Discord payloads are reformatted by ClickProbe; generic receivers get the envelope above.
Signature verification
Every delivery carries three headers: X-ClickProbe-Event (the event type), X-ClickProbe-Delivery
(a UUID, stable across retries of the same delivery — use it for idempotency), and
X-ClickProbe-Signature: sha256=<hex>, where <hex> = HMAC_SHA256(your_secret, raw_body). Verify the
signature using your stored secret, over the raw request body bytes (not parsed JSON), with a
constant-time comparison:
import hmac
import hashlib
def verify(secret: str, body: bytes, signature_header: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature_header)
const crypto = require("crypto");
function verify(secret, body, signatureHeader) {
const expected = "sha256=" + crypto.createHmac("sha256", secret).update(body).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader));
}
Retry behaviour
If your endpoint returns a non-2xx response, ClickProbe retries with exponential backoff:
| Attempt | Delay |
|---|---|
| 1 → 2 | +30 seconds |
| 2 → 3 | +2 minutes |
| 3 → 4 | +10 minutes |
| 4 → 5 | +30 minutes |
| 5 → 6 | +2 hours |
| After 6 | Permanently failed — no further retries |
Non-retriable responses (400, 401, 403, 404, 410, 422) are marked failed immediately.
Managing webhooks
- Active toggle — pause delivery without deleting the webhook.
- Send test — sends a
test.pingevent immediately to verify your endpoint is reachable. - Delete — removes the webhook and all pending deliveries.