Dev plan or higher. Outbound webhooks are not available on the Free plan. View plans →
BattleTest sends a signed HTTP POST to your endpoint for each event you subscribe to. Configure webhooks at Settings → Webhooks.
Envelope
Every webhook request body is a JSON object with this shape:
Supported events
Payload schemas
workflow.started
Fires when a live battletest scan begins.
workflow.completed
Fires when a live battletest scan finishes successfully.
workflow.failed
Fires when a live battletest scan fails to complete.
workflow.finding
Fires once per confirmed security finding during a scan. Subscribe to this event to get real-time alerts as vulnerabilities are discovered rather than waiting for the scan to complete.
workflow.step_completed
Fires after each pipeline step finishes. Useful for progress tracking in long-running scans.
workflow.checkpoint
Fires when the scan engine pauses to request human approval before taking a potentially sensitive action (human-in-the-loop mode). Respond to the checkpoint via the BattleTest API or dashboard to resume the scan.
pr_review.started
Fires when BattleTest begins reviewing a pull request.
pr_review.completed
Fires when BattleTest finishes reviewing a pull request.
pr_review.failed
Fires when the review pipeline fails to complete due to an internal error.
Signature verification
When a signing secret is set, every delivery includes an X-BattleTest-Signature header containing sha256=<hex>. Verify it against the raw request body before processing the payload.
Always verify the signature before acting on a payload. Use a constant-time comparison to prevent timing attacks.
Retries
Failed deliveries (non-2xx response or timeout) are retried up to 3 times with exponential backoff starting at 1 second. Respond with any 2xx status to acknowledge receipt — BattleTest does not inspect the response body.