Vigil accepts pushed alerts from Darktrace via signed HTTP webhooks. Both Darktrace SaaS tenants and on-prem master appliances are supported — they emit the same JSON payload shapes.
There is currently no MCP (agent-pull) tool for Darktrace; this cut is push-only. Investigations that want to pivot back into Darktrace should follow the console link stored on each ingested finding.
Supported alert streams
| Stream | Endpoint |
|---|---|
| Model Breach Alerts | POST /api/webhooks/darktrace/model-breach |
| AI Analyst Incidents | POST /api/webhooks/darktrace/ai-analyst |
| System Status Alerts | POST /api/webhooks/darktrace/system-status |
| Health probe (GET) | GET /api/webhooks/darktrace/health |
Each alert is transformed into a Vigil finding (data_source = "darktrace")
and passed to the standard ingestion pipeline, so triage, correlation, and
case creation work identically to Splunk/CrowdStrike sources.
Vigil configuration
Set in .env:
DARKTRACE_ENABLED=true
DARKTRACE_URL=https://<tenant>.cloud.darktrace.com # or https://<on-prem-master>
DARKTRACE_WEBHOOK_SECRET=<random-32+-char-string>
# optional — hard cap on webhook body size (default 1024 KB)
DARKTRACE_MAX_BODY_KB=1024
Generate a secret:
openssl rand -hex 32
DARKTRACE_URL is optional. When set, every ingested finding gets an
evidence_links entry pointing back to the originating console (model
breach or AI Analyst incident URL).
Darktrace configuration
- In the Darktrace Threat Visualizer: System Config → Workflow Integrations → Add → choose Custom Webhook (or the specific integration if available for AI Analyst).
- URL:
https://<vigil-host>:6987/api/webhooks/darktrace/model-breach(repeat forai-analystandsystem-status— each endpoint is separate so you can wire each stream independently). - Authentication: select HMAC-SHA256. Paste the same value you used for
DARKTRACE_WEBHOOK_SECRET. - Signature header:
X-Darktrace-Signature— hex HMAC-SHA256 over the raw request body. Vigil also accepts thesha256=...prefix style. - Click Test — Vigil returns
202 Acceptedon success,401if the signature doesn’t match.
SaaS vs on-prem notes
- SaaS tenants cannot emit syslog over the public internet — webhooks are the only option. Make sure Vigil is reachable at a TLS-terminated, publicly-routable URL.
- On-prem masters work the same way; if your Vigil instance is only reachable internally, point Darktrace at the internal hostname. Syslog remains possible for on-prem deployments but is not used by this integration.
Verifying end-to-end
- Run Vigil’s backend (
./start.shoruvicorn services.api.main:app --reload). - Confirm the receiver is live:
curl https://<vigil-host>:6987/api/webhooks/darktrace/health - Smoke test with a signed payload:
BODY='{"pbid":12345,"model":{"name":"Device / Anomalous Connection"},"score":0.92,"device":{"ip":"10.0.0.5","hostname":"laptop-01"},"time":1712995200000}' SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$DARKTRACE_WEBHOOK_SECRET" -hex | awk '{print $2}') curl -X POST https://<vigil-host>:6987/api/webhooks/darktrace/model-breach \ -H "Content-Type: application/json" \ -H "X-Darktrace-Signature: $SIG" \ -d "$BODY"Expect
HTTP 202with{"accepted": true, "finding_id": "f-YYYYMMDD-xxxxxxxx"}. - Confirm ingestion:
curl https://<vigil-host>:6987/api/findings?data_source=darktrace.
Idempotency
Vigil derives each finding_id from the alert’s stable identifier
(pbid for Model Breach, uuid for AI Analyst, id/name fallback for
System Status). Replaying the same webhook produces the same finding ID,
which the ingestion layer skips as a duplicate — safe to re-deliver.
Security
- Every request body is HMAC-verified before any parsing. Unsigned/invalid
requests are rejected with
401and no content is touched. - If
DARKTRACE_WEBHOOK_SECRETis unset the receiver fails closed with503— it never ingests unauthenticated traffic. - Bodies above
DARKTRACE_MAX_BODY_KBare rejected with413. - Expose the endpoint over TLS only; the signature protects integrity but not confidentiality.