Skip to content

Commit 4ef0e54

Browse files
Document vapi call concurrency (#808)
1 parent d482406 commit 4ef0e54

File tree

2 files changed

+173
-17
lines changed

2 files changed

+173
-17
lines changed

fern/calls/call-concurrency.mdx

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
---
2+
title: Understanding Call Concurrency
3+
subtitle: Plan, monitor, and scale simultaneous Vapi calls
4+
slug: calls/call-concurrency
5+
description: Learn how concurrency slots work, how to stay within the default limit, and how to raise capacity for larger campaigns.
6+
---
7+
8+
## Overview
9+
10+
Call concurrency represents how many Vapi calls can be active at the same time. Each call occupies one slot, similar to using a finite set of phone lines.
11+
12+
**In this guide, you'll learn to:**
13+
- Understand the default concurrency allocation and when it is usually sufficient
14+
- Keep outbound and inbound workloads within plan limits
15+
- Increase reserved capacity directly from the Vapi Dashboard
16+
- Inspect concurrency data through API responses and analytics queries
17+
18+
## What is concurrency?
19+
20+
Every Vapi account includes **10 concurrent call slots** by default. When all slots are busy, new outbound dials or inbound connections wait until a slot becomes free.
21+
22+
<CardGroup cols={2}>
23+
<Card title="Inbound agents" icon="phone" iconType="solid">
24+
Rarely hit concurrency caps unless traffic surges (launches, seasonal spikes).
25+
</Card>
26+
<Card title="Outbound agents" icon="phone-outgoing" iconType="solid">
27+
More likely to reach limits when running large calling batches.
28+
</Card>
29+
</CardGroup>
30+
31+
These limits ensure the underlying compute stays reliable for every customer. Higher concurrency requires reserving additional capacity, which Vapi provides through custom or add-on plans.
32+
33+
## Managing concurrency
34+
35+
### Outbound campaigns
36+
37+
Batch long lead lists into smaller chunks (for example, 50–100 numbers) and run those batches sequentially. This keeps your peak concurrent calls near the default limit while still working through large sets quickly.
38+
39+
### High-volume operations
40+
41+
If you regularly exceed **50,000 minutes per month**, talk with Vapi about:
42+
43+
- **Custom plans** that include higher baked-in concurrency
44+
- **Add-on bundles** that let you purchase extra call lines only when you need them
45+
46+
<Tip>
47+
Use billing reports to pair minute usage with concurrency spikes so you can upgrade before calls are blocked.
48+
</Tip>
49+
50+
## Increase your concurrency limit
51+
52+
You can raise or reserve more call lines without contacting support:
53+
54+
1. Open the [Vapi Dashboard](https://dashboard.vapi.ai/settings/billing).
55+
2. Navigate to **Settings → Billing**.
56+
3. Find **Reserved Concurrency (Call Lines)**.
57+
4. Increase the limit or purchase add-on concurrency lines.
58+
59+
Changes apply immediately, so you can scale ahead of known traffic surges.
60+
61+
## View concurrency in call responses
62+
63+
When you create a call with `POST /call`, the response includes a `subscriptionLimits` object that shows the current state of your account.
64+
65+
### Example request
66+
67+
```bash
68+
curl 'https://api.vapi.ai/call' \
69+
-H 'authorization: Bearer {VAPI-PRIVATE-TOKEN}' \
70+
-H 'content-type: application/json' \
71+
--data-raw '{
72+
"assistantId": "4a170597-a0c2-4657-8c32-cb93f080cead",
73+
"customer": {"number": "+918936850777"},
74+
"phoneNumberId": "c6ea6cb0-0dfb-4a65-918f-6a33abb54b64"
75+
}'
76+
```
77+
78+
### Example response snippet
79+
80+
```json
81+
{
82+
"subscriptionLimits": {
83+
"concurrencyBlocked": false,
84+
"concurrencyLimit": 10,
85+
"remainingConcurrentCalls": 9
86+
},
87+
"id": "019a9046-121e-766d-bd1f-84f3ccc309c1",
88+
"status": "queued"
89+
}
90+
```
91+
92+
### Field reference
93+
94+
- **`concurrencyBlocked`**`true` if the call could not start because all slots were full.
95+
- **`concurrencyLimit`** — Total concurrent call slots currently available to your org.
96+
- **`remainingConcurrentCalls`** — How many slots were open at the time you created the call.
97+
98+
Build monitoring around these values to alert when you approach the cap.
99+
100+
## Track concurrency with the Analytics API
101+
102+
Use the `/analytics` endpoint to review historical concurrency usage and spot patterns that justify more capacity.
103+
104+
### Example request
105+
106+
```bash
107+
curl 'https://api.vapi.ai/analytics' \
108+
-H 'authorization: Bearer {VAPI-PRIVATE-TOKEN}' \
109+
-H 'content-type: application/json' \
110+
--data-raw '{
111+
"queries": [{
112+
"name": "Number of Concurrent Calls",
113+
"table": "subscription",
114+
"timeRange": {
115+
"start": "2025-10-16T18:30:00.000Z",
116+
"end": "2025-11-17T05:31:10.184Z",
117+
"step": "day"
118+
},
119+
"operations": [{
120+
"operation": "max",
121+
"column": "concurrency",
122+
"alias": "concurrency"
123+
}]
124+
}]
125+
}'
126+
```
127+
128+
### Example response
129+
130+
```json
131+
[{
132+
"name": "Number of Concurrent Calls",
133+
"timeRange": {
134+
"start": "2025-10-16T18:30:00.000Z",
135+
"end": "2025-11-17T05:31:10.184Z",
136+
"step": "day",
137+
"timezone": "UTC"
138+
},
139+
"result": [
140+
{ "date": "2025-11-05T00:00:00.000Z", "concurrency": 0 },
141+
{ "date": "2025-11-10T00:00:00.000Z", "concurrency": 1 },
142+
{ "date": "2025-11-17T00:00:00.000Z", "concurrency": 1 }
143+
]
144+
}]
145+
```
146+
147+
Adjust the `timeRange.step` to inspect usage by hour, day, or week. Peaks that align with campaign launches, seasonality, or support events highlight when you should reserve additional call lines.
148+
149+
## Next steps
150+
151+
- **[Call queue management](mdc:docs/calls/call-queue-management):** Build a Twilio queue to buffer calls when you hit concurrency caps.
152+
- **[Outbound campaign planning](mdc:docs/outbound-campaigns/overview):** Design outbound strategies that pair batching with analytics.
153+
- **[Enterprise plans](mdc:docs/enterprise/plans):** Review larger plans that include higher default concurrency.

fern/docs.yml

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -411,23 +411,26 @@ navigation:
411411
path: calls/customer-join-timeout.mdx
412412
- page: Voicemail detection
413413
path: calls/voicemail-detection.mdx
414-
- section: Transfer calls
415-
icon: fa-light fa-phone-arrow-right
416-
contents:
417-
- page: Call forwarding
418-
path: call-forwarding.mdx
419-
- page: Assistant-based warm transfer
420-
path: calls/assistant-based-warm-transfer.mdx
421-
- page: Dynamic call transfers
422-
path: calls/call-dynamic-transfers.mdx
423-
- page: On-hold specialist transfer
424-
path: calls/call-handling-with-vapi-and-twilio.mdx
425-
- page: Debug forwarding drops
426-
path: calls/troubleshoot-call-forwarding-drops.mdx
427-
icon: fa-light fa-bug
428-
- page: Call queue management
429-
path: calls/call-queue-management.mdx
430-
icon: fa-light fa-phone-office
414+
- section: Transfer calls
415+
icon: fa-light fa-phone-arrow-right
416+
contents:
417+
- page: Call forwarding
418+
path: call-forwarding.mdx
419+
- page: Assistant-based warm transfer
420+
path: calls/assistant-based-warm-transfer.mdx
421+
- page: Dynamic call transfers
422+
path: calls/call-dynamic-transfers.mdx
423+
- page: On-hold specialist transfer
424+
path: calls/call-handling-with-vapi-and-twilio.mdx
425+
- page: Debug forwarding drops
426+
path: calls/troubleshoot-call-forwarding-drops.mdx
427+
icon: fa-light fa-bug
428+
- page: Call queue management
429+
path: calls/call-queue-management.mdx
430+
icon: fa-light fa-phone-office
431+
- page: Call concurrency
432+
path: calls/call-concurrency.mdx
433+
icon: fa-light fa-gauge-high
431434
- page: Call end reasons
432435
path: calls/call-ended-reason.mdx
433436
icon: fa-light fa-phone-hangup

0 commit comments

Comments
 (0)