Webhook Notifications
Webhook notifications send JSON payloads to your automation tools whenever a detection finds new events or an investigation is updated. Use them to build SOAR workflows in Tines, N8N, or any platform that accepts HTTP webhooks.
Setup
Add a webhook integration in Settings > Integrations (Tines, N8N, or a custom webhook URL)
Navigate to Settings > Notifications
Toggle Webhook to enable webhook notifications
Select which enrolled webhook providers should receive notifications
Optionally adjust Max events per notification (default: 5,000) to control payload size
Webhooks always fire immediately, even when the frequency mode is set to Batch. The batch frequency only affects email delivery timing.
Detection Webhook Payload
When a detection triggers, Anzenna sends a
POST request with the following JSON
payload:
{
"notification": {
"id": "019cf975-c3fd-7714-85fe-fb8c8986d102",
"title": "Public Google Workspace Shares: 3 new events",
"body": "Users sharing documents publicly\n\n3 new events since last notification\n3 events attached\n2 affected users\nsince Mar 17, 2:30 PM",
"action_url": "https://app.anzenna.ai/u/detections/98fd8ca7-9633-4e0f-8eca-ac3c56b4de97"
},
"delivery": {
"id": "019cf975-c410-7abc-9a12-3456789abcde",
"recipient_name": "Security Team",
"channel": "webhook"
},
"metadata": {
"detection_id": "98fd8ca7-9633-4e0f-8eca-ac3c56b4de97",
"previous_count": 42,
"current_count": 45,
"since": 1710612345678,
"event_count": 3,
"user_count": 2,
"affected_users": ["alice@example.com", "bob@example.com"],
"events": [
{
"id": "019a787e-c083-711c-8f3d-4c0c7d61e0ec",
"person_name": "Alice Smith",
"description": "Shared document (quarterly-report.xlsx) publicly",
"timestamp": 1710612300000
}
]
}
}
Field Reference
| Field | Description |
|---|---|
notification.id | Unique notification ID |
notification.title | Human-readable title: "{detection}: {N} new events" |
notification.body | Summary with event count, affected users, and time since last notification |
notification.action_url | Direct link to the detection in Anzenna |
metadata.detection_id | Detection ID (use in API calls) |
metadata.previous_count | Event count at the time of the last notification |
metadata.current_count | Current event count |
metadata.since | Unix timestamp (ms) of when the last notification was sent |
metadata.event_count | Number of new events since last notification |
metadata.user_count | Number of affected users |
metadata.affected_users | List of affected user email addresses |
metadata.events | Array of event summaries (limited by max events per notification setting) |
Event Summary Fields
| Field | Description |
|---|---|
events[].id | Event ID, use this to fetch full details via the API |
events[].person_name | Display name of the person involved |
events[].description | Human-readable event description |
events[].timestamp | Unix timestamp (ms) of when the event occurred |
Investigation Webhook Payload
When an investigation is completed or updated, Anzenna sends a
POST request with the following JSON
payload. The key difference from detection webhooks is the use of
investigation_metadata instead of
metadata.
{
"notification": {
"id": "019cf975-d4ae-7714-85fe-ab1c2d3e4f56",
"title": "Investigation Update: Unusual login pattern detected",
"body": "Investigation for Alice Smith has been completed\n\nOutcome: Confirmed risk\nRisk score: 8.2",
"action_url": "https://app.anzenna.ai/u/investigations/b7e2f1a9-4c38-4d12-9a56-1234abcd5678"
},
"delivery": {
"id": "019cf975-d4b0-7abc-9a12-9876fedcba01",
"recipient_name": "Security Team",
"channel": "webhook"
},
"investigation_metadata": {
"investigation_id": "b7e2f1a9-4c38-4d12-9a56-1234abcd5678",
"status": "completed",
"outcome": "confirmed_risk",
"headline": "Unusual login pattern detected",
"person_name": "Alice Smith",
"person_email": "alice@example.com",
"detection_name": "Suspicious Login Activity"
}
}
Investigation Metadata Fields
| Field | Description |
|---|---|
| Investigation ID (use in API calls) |
investigation_metadata.status | Current status of the investigation |
investigation_metadata.outcome | Investigation outcome (e.g. confirmed_risk, no_risk) |
investigation_metadata.headline | Short description of what was investigated |
| Name of the person under investigation |
| Email of the person under investigation |
| Name of the detection that triggered this investigation |
Detection webhooks have a metadata
field with event IDs. Investigation webhooks have an
investigation_metadata field with an
investigation ID. Your automation can route on which field is present. The
Tines starter story
below demonstrates this pattern.
Enriching via the API
Webhook payloads include summaries. To get full details (risk scores, asset names, employee context, AI investigation reports), use the Anzenna API.
Create an API Key
Navigate to Settings > API Keys
Click Create API Key
Grant the Admin scope with Read-only access
Copy the key value. You won't be able to see it again
All API calls require the key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get Full Event Details (Detections)
Look up a specific event by its ID from the webhook payload:
curl -X POST https://api.anzenna.ai/api-key/v1/events \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{"query": "id = '\''019a787e-c083-711c-8f3d-4c0c7d61e0ec'\''"}'
{
"items": [
{
"id": "019a787e-c083-711c-8f3d-4c0c7d61e0ec",
"issue_type": "direct_sharing_external",
"employee_email": "alice@example.com",
"employee_name": "Alice Smith",
"asset_name": "quarterly-report.xlsx",
"happened": "2026-03-17T17:48:17.794Z",
"risk_score": 4.9,
"source": "google_workspace",
"high_prevalence": false
}
],
"pagination": {
"count": 1
}
}
Get Investigation Details
Look up an investigation by its ID from the webhook payload:
curl -X GET https://api.anzenna.ai/api-key/v1/investigations/$INVESTIGATION_ID \
-H "Authorization: Bearer $API_KEY"
The response includes the full investigation report: AI-generated summary, confidence level, recommended action, findings with supporting evidence, person context (role, department, manager), and the detection that triggered it.
Queryable Fields (Events)
Filter events using SQL-like syntax in the
query parameter. Combine conditions
with AND /
OR.
| Field | Type | Example |
|---|---|---|
id | string | id = '019a787e-...' |
employee_email | string | |
happened | timestamp | |
risk_score | number | risk_score > 4.0 |
source | string | source = 'google_workspace' |
allowlisted | boolean | allowlisted = false |
high_prevalence | boolean | high_prevalence = false |
Other Useful Endpoints
curl -X GET https://api.anzenna.ai/api-key/v1/detections/{detection_id} \
-H "Authorization: Bearer $API_KEY"
curl -X POST https://api.anzenna.ai/api-key/v1/detections/{detection_id}/events \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{}'
curl -X GET https://api.anzenna.ai/api-key/v1/detections/{detection_id}/users \
-H "Authorization: Bearer $API_KEY"
Tines Integration
The starter story below sets up a pipeline that receives Anzenna webhooks, routes them by type (detection or investigation), and enriches them via the API. It handles both notification types in a single story.
┌─ Route: Detection ─── Explode Event IDs ─── Get Detection Details ─── Build Event Summary
Webhook → Extract Fields ─┤
└─ Route: Investigation ─── Get Investigation Details ─── Build Investigation Summary
Webhook Action: Receives the Anzenna notification payload
Extract Alert Fields: Parses event IDs from detection webhooks and the investigation ID from investigation webhooks
Route: Detection. Triggers when
event_idsis non-emptyRoute: Investigation. Triggers when
investigation_idis present
The detection path explodes event IDs, fetches full details for each event via the API, and builds a structured summary with overview, user, host, device, and location context. The investigation path fetches the full investigation report including AI-generated summary, confidence level, recommended actions, findings, and evidence.
Setup Instructions
After importing the story into Tines, configure the following:
Go to your Tines tenant > Credentials > New Credential:
- Name:
anzenna_api_key Type: Text
Value: Your Anzenna API key (see
Create an API Key
above)
Go to your Tines tenant > Resources > New Resource:
- Name:
anzenna_api_base_url Type: Text
- Value:
https://api.anzenna.ai
Copy the webhook URL from the Webhook Action in Tines
In Anzenna, go to Settings > Integrations and add a Tines integration with the webhook URL
Go to Settings > Notifications and enable the Tines integration under Webhook Notifications
Ideas for Extending the Story
Route by severity: Branch on
risk_scoreto handle high, medium, and low risk events differentlyCreate tickets: Post to Jira or ServiceNow with detection or investigation context
Notify your team: Send to Slack or Teams with the
action_urlfor quick investigationAuto-remediate: Trigger response actions for high-confidence detections
Escalate investigations: Route confirmed-risk investigations to incident response based on the AI report's recommended action
N8N Integration
The same webhook payload format works with N8N. Set up a Webhook trigger node, then follow the same pattern:
Create a Webhook trigger node in your N8N workflow
Copy the webhook URL and add it as a webhook integration in Anzenna ( Settings > Integrations)
Use an IF node to route based on whether
metadata.eventsorinvestigation_metadatais presentFor detections: use a Loop Over Items node to iterate over event IDs, then an HTTP Request node to call the Anzenna events API for full details
For investigations: use an HTTP Request node to call
GET /api-key/v1/investigations/{investigation_id}
for the full report