Test deliveries today
Webhook reference: endpoint setup, request signing and test deliveries.
Add an endpoint in Settings, send a signed test delivery, and verify it with HMAC-SHA256. Live delivery of case, finding and pipeline events is planned.
Payload
JSON
test deliveries
Signatures
HMAC
SHA-256
Attempts
3
1 s, then 2 s
Payload format
Test deliveries are JSON with `id`, `eventType`, `timestamp`, `organizationId` and `data`. Live event delivery is planned, and its payload format is not final.
Test delivery body
{
"id": "0b6f2d3e-4c1a-4e8b-9f57-2a1d6c8e5b90",
"eventType": "case.created",
"timestamp": "2026-03-31T10:00:00.000Z",
"organizationId": "clz8q1x4d0000l708abcd1234",
"data": {
"test": true,
"message": "This is a test webhook from CVERiskPilot",
"caseId": "test-case-id",
"title": "Test Vulnerability Case",
"severity": "MEDIUM"
}
}Signature verification
Every delivery includes an HMAC-SHA256 signature over the raw request body.
X-Webhook-Signature — HMAC-SHA256 hex digestX-Webhook-Event — short event type like case.createdX-Webhook-Timestamp — delivery timestampNode.js verification
import crypto from 'node:crypto';
function verifyWebhook(body: string, signature: string, secret: string): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expected, 'hex'),
);
}Delivery behavior
Test deliveries are attempted up to three times, 1 and 2 seconds apart, if the endpoint does not return a `2xx` within 10 seconds.
Attempt 1
Immediate
Attempt 2
+1 s
Attempt 3
+2 s
Test deliveries are not recorded in the Settings delivery log.
Planned event types
Live delivery of these events is not yet available. The payloads below are illustrative and may change before it ships.
case.createdA new vulnerability case was created from ingested findings.
{
"id": "case_abc123",
"title": "CVE-2024-21762 — Fortinet FortiOS RCE",
"severity": "CRITICAL",
"cveIds": ["CVE-2024-21762"],
"epssScore": 0.972,
"kevListed": true,
"status": "NEW",
"findingCount": 3,
"createdAt": "2026-03-31T10:00:00Z"
}case.status_changedA case transitioned into a new remediation state.
{
"id": "case_abc123",
"fromStatus": "NEW",
"toStatus": "TRIAGE",
"changedBy": "user_analyst",
"reason": "AI triage flagged as TRUE_POSITIVE",
"changedAt": "2026-03-31T14:00:00Z"
}finding.createdA raw finding was ingested from a scan upload or connector sync.
{
"id": "finding_def456",
"scannerType": "NESSUS",
"dedupKey": "CVE-2024-21762:192.168.1.10:443",
"assetId": "asset_web01",
"vulnerabilityCaseId": "case_abc123",
"discoveredAt": "2026-03-31T10:00:00Z"
}sla.breachedA case exceeded its SLA due date without resolution.
{
"caseId": "case_abc123",
"slaPolicyId": "sla_critical_7d",
"dueAt": "2026-03-28T00:00:00Z",
"severity": "CRITICAL",
"daysOverdue": 3
}pipeline.scan.completedA pipeline scan finished and published its verdict.
{
"scanId": "scan_jkl012",
"repoUrl": "https://github.com/acme/app",
"branch": "main",
"verdict": "FAIL",
"totalFindings": 12,
"criticalCount": 2,
"highCount": 4,
"frameworks": ["nist-800-53", "soc2"]
}pipeline.compliance.violationA pipeline scan found a framework-level compliance issue.
{
"scanId": "scan_jkl012",
"framework": "nist-800-53",
"control": "SI-2",
"controlTitle": "Flaw Remediation",
"violation": "3 critical CVEs without patches applied",
"severity": "HIGH"
}