> ## Documentation Index
> Fetch the complete documentation index at: https://battletest.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# How to send findings to external tools

> Wire signed BattleTest webhooks into Slack, PagerDuty, ticketing systems, or SIEMs — create endpoints, store the signing secret, and alert on findings.

<Warning>
  **Dev plan or higher.** Outbound webhooks are not available on the Free plan. [View plans →](https://battletest.dev/pricing)
</Warning>

BattleTest sends signed webhook events when findings are created and when scan runs complete. Use them to push security data into the tools your team already watches. For the full payload schema, event list, and retry behaviour, see the [Outbound Webhooks reference](/docs/reference/webhooks).

## Create a webhook

<Steps>
  <Step title="Open Webhooks settings">
    Go to [Settings → Webhooks](https://battletest.dev/settings?tab=webhooks) and click **Add webhook**.
  </Step>

  <Step title="Enter your endpoint URL">
    Paste the HTTPS URL that should receive events — your server, a Slack incoming webhook proxy, or a workflow automation endpoint.
  </Step>

  <Step title="Copy the signing secret">
    BattleTest shows a signing secret once, on creation. Store it in your secrets manager — you'll need it to [verify signatures](/docs/reference/webhooks#signature-verification).
  </Step>

  <Step title="Save and test">
    Save the webhook. Use the **Send test event** button to confirm your endpoint receives and acknowledges the payload with a 2xx response.
  </Step>
</Steps>

## Alert on confirmed critical findings

Listen for `battletest.vulnerability` events, which fire only on confirmed CRITICAL or HIGH live-scan findings, and route them to a paging or chat channel.

```js theme={null}
app.post('/battletest-webhook', (req, res) => {
  // verify the signature first — see the webhooks reference
  const { event, data } = req.body
  if (event === 'battletest.vulnerability' && data.finding.severity === 'critical') {
    notifyPagerDuty(`Critical: ${data.finding.title} on ${data.domain}`)
  }
  res.sendStatus(200)
})
```

## Auto-create tickets for new findings

On `pr_review.completed`, parse the findings and open a ticket for any HIGH or CRITICAL finding that isn't already tracked. The `run_id` in the payload links back to the full finding detail in the dashboard.

## Track posture over time

On every `battletest.completed`, write the risk score and finding counts to your analytics store, then plot the trend in Grafana or Datadog alongside your other engineering metrics.

<Note>
  Always verify the `x-battletest-signature` header before acting on a payload. See [Signature verification](/docs/reference/webhooks#signature-verification) for the HMAC check.
</Note>
