Skip to main content
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:

Request headers

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.