Skip to content

Commit 3bdb62a

Browse files
Clarify monitoring webhook payload, lifecycle, and ZDR limits (#1187)
1 parent 0ee610b commit 3bdb62a

2 files changed

Lines changed: 84 additions & 5 deletions

File tree

‎fern/observability/monitoring-quickstart.mdx‎

Lines changed: 80 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ Monitoring is Vapi's automated quality and effectiveness system for voice AI. Yo
2121

2222
### Monitor categories
2323

24-
- **Technical** tracks system-level failures like API errors, provider outages, and timeouts
25-
- **Infrastructure** tracks resource utilization, latency, and capacity issues
26-
- **Effectiveness** tracks assistant performance metrics like task completion and user satisfaction
27-
- **Compliance** tracks regulatory and policy adherence across conversations
24+
Categories help you organize and route monitors. Technical and Infrastructure monitors currently share the same trigger options, so the metric either category evaluates is defined by the Insight attached to its trigger. Effectiveness and Compliance monitors use a separate evaluation flow based on call transcripts and structured outputs.
25+
26+
- **Technical** groups issues in your own integrations and configuration, such as API errors, provider outages, and timeouts
27+
- **Infrastructure** groups platform-level issues, such as capacity and resource limits
28+
- **Effectiveness** groups assistant performance metrics like task completion and user satisfaction
29+
- **Compliance** groups regulatory and policy adherence across conversations
2830

2931
### What you'll build
3032

@@ -75,6 +77,12 @@ In this quickstart, you will create a monitor that tracks error rates across you
7577
assistants have processed calls.
7678
</Note>
7779

80+
<Warning>
81+
Monitoring currently requires retained call data. Organizations using Zero
82+
Data Retention (ZDR) do not receive monitor evaluations because the required
83+
call logs are not retained.
84+
</Warning>
85+
7886
## Step 1: Set up notifiers
7987

8088
Notifiers are alert channels (email, Slack, or webhook) that send notifications when issues are detected. You configure them as credentials in the Dashboard.
@@ -115,6 +123,73 @@ Once created, each notifier has a credential ID that you reference in your monit
115123
</Tab>
116124
</Tabs>
117125

126+
## Webhook payload
127+
128+
When a webhook notifier is attached to a trigger, Vapi sends a single `POST` request the moment an issue is created. The body is the same envelope every time, wrapped in a `message` object:
129+
130+
<Tip>
131+
Your endpoint should verify that each request actually came from Vapi. Configure authentication directly on the webhook notifier. The Dashboard supports OAuth 2.0 and bearer-token authentication for webhook notifiers.
132+
</Tip>
133+
134+
```json title="Webhook payload"
135+
{
136+
"message": {
137+
"type": "issue.created",
138+
"timestamp": 1752574205000,
139+
"orgId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
140+
"issue": {
141+
"id": "e5f6a7b8-c9d0-1234-efab-567890123456",
142+
"status": "created",
143+
"totalCalls": 150,
144+
"failingCalls": 12,
145+
"evaluationStartAt": "2025-07-15T09:30:00.000Z",
146+
"createdAt": "2025-07-15T10:30:00.000Z"
147+
},
148+
"monitor": {
149+
"id": "550e8400-e29b-41d4-a716-446655440000",
150+
"name": "Error Rate Monitor",
151+
"description": "Tracks API and provider errors across all assistants",
152+
"category": "technical",
153+
"trigger": {
154+
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
155+
"threshold": { "type": "number", "comparator": "gt", "value": 5 },
156+
"severity": "error",
157+
"insight": {
158+
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
159+
"name": "Error count",
160+
"type": "text"
161+
}
162+
}
163+
}
164+
}
165+
}
166+
```
167+
168+
### Field reference
169+
170+
| Field | Meaning |
171+
| --- | --- |
172+
| `message.type` | Always `issue.created`. This is the only monitoring event Vapi emits (see [below](#one-webhook-per-issue)). |
173+
| `message.timestamp` | When the alert was sent, in milliseconds since the Unix epoch. |
174+
| `message.orgId` | The organization that owns the monitor and issue. |
175+
| `message.issue.totalCalls` | Calls evaluated in the window. |
176+
| `message.issue.failingCalls` | Calls that matched the Insight during the evaluation that created the issue. Your failure rate for that evaluation is `failingCalls / totalCalls`. The `callsCount` returned by `GET /monitoring/issue/:id` can increase as later evaluations add affected calls to the active issue. |
177+
| `message.issue.evaluationStartAt` | Start of the evaluation window. |
178+
| `message.monitor.category` | `technical`, `infrastructure`, `effectiveness`, or `compliance`. The payload shape is identical across categories, so this field is how you tell them apart. |
179+
| `message.monitor.trigger.insight.name` | Human-readable name of the metric that breached, for display. |
180+
| `message.monitor.trigger.insight.id` | Stable ID of the configured Insight. Match on this rather than `name` for routing logic. |
181+
| `message.monitor.trigger.threshold` | The comparator and value that were exceeded. |
182+
183+
<Note>
184+
The webhook reports **only** the breach counts (`totalCalls` and `failingCalls`). It does not include per-call latency (such as p50 or p95), remaining concurrency, or the list of affected calls. To get the individual call IDs behind an issue, call `GET /monitoring/issue/:id` and read the `calls` array (see [Step 3](#step-3-view-issues)).
185+
</Note>
186+
187+
### One webhook per issue
188+
189+
Vapi sends the webhook once, when the issue is first created. There are no `issue.updated` or `issue.resolved` webhooks. If the problem persists across evaluation windows, Vapi updates the same non-resolved issue with newly affected calls and does not send another webhook. After that issue is resolved, a later threshold breach creates a new issue and sends a new `issue.created` webhook. Acknowledging or resolving an issue happens in the Dashboard or via `PATCH /monitoring/issue/:id` and does not emit a webhook.
190+
191+
By default, delivery is attempted once per notifier. If a backoff plan is configured for the webhook notifier's server, failed requests can be retried. The final delivery result is recorded in the issue's `alerts` array, so a `"failure"` status there means the notification could not be delivered (see [Troubleshooting](#troubleshooting)).
192+
118193
## Step 2: Create a monitor
119194

120195
Define a monitor that tracks error rates and alerts you when errors exceed a threshold.
@@ -584,7 +659,7 @@ curl -X PATCH "https://api.vapi.ai/monitoring/issue/e5f6a7b8-c9d0-1234-efab-5678
584659
| Analysis returns an error | Ensure the issue has associated calls. Analysis requires call data to identify patterns. |
585660
| Monitor not evaluating | Check that the `insightId` references a valid Insight. Verify the trigger interval is at least 1 minute. |
586661
| Wrong calls detected | Review the Insight query that the trigger references. Ensure the monitor targets the correct assistants. |
587-
| Duplicate issues | Triggers create new issues per evaluation window. This is expected behavior when a problem persists across multiple evaluation periods. |
662+
| A repeated breach does not create a new issue | A trigger updates the same non-resolved issue across evaluation windows. After you resolve that issue, a later threshold breach can create a new issue. |
588663

589664
<Warning>
590665
If an alert shows a `"failure"` status in the issue's alerts array, the

‎fern/server-url/events.mdx‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ Most events are informational and do not require a response. Responses are only
2929

3030
Note: Some specialized messages like "voice-request" and "call.endpointing.request" are sent to their dedicated servers if configured (e.g. `assistant.voice.server.url`, `assistant.startSpeakingPlan.smartEndpointingPlan.server.url`).
3131

32+
<Note>
33+
Monitoring alerts are a separate webhook. When a monitor detects an issue, Vapi sends an `issue.created` message to your notifier endpoint rather than the assistant Server URL. Its payload is documented in [Monitoring](/observability/monitoring-quickstart#webhook-payload).
34+
</Note>
35+
3236
### Function Calling (Tools)
3337

3438
<Info>

0 commit comments

Comments
 (0)