From vapi-voice-ai
Create outbound phone calls, web calls, and batch calls using the Vapi API. Useful for automated calls, testing voice assistants, scheduling call campaigns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/vapi-voice-ai:create-callThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Initiate outbound phone calls, web calls, and batch calls using Vapi's API. Connect your voice assistants to real phone numbers and test them programmatically.
Initiate outbound phone calls, web calls, and batch calls using Vapi's API. Connect your voice assistants to real phone numbers and test them programmatically.
Setup: Ensure
VAPI_API_KEYis set. See thesetup-api-keyskill if needed.
curl -X POST https://api.vapi.ai/call \
-H "Authorization: Bearer $VAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"assistantId": "your-assistant-id",
"phoneNumberId": "your-phone-number-id",
"customer": {
"number": "+11234567890"
}
}'
import { VapiClient } from "@vapi-ai/server-sdk";
const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });
const call = await vapi.calls.create({
assistantId: "your-assistant-id",
phoneNumberId: "your-phone-number-id",
customer: {
number: "+11234567890",
},
});
console.log("Call created:", call.id);
import requests
import os
response = requests.post(
"https://api.vapi.ai/call",
headers={
"Authorization": f"Bearer {os.environ['VAPI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"assistantId": "your-assistant-id",
"phoneNumberId": "your-phone-number-id",
"customer": {"number": "+11234567890"},
},
)
call = response.json()
print(f"Call initiated: {call['id']}")
Requires an assistant, a Vapi phone number, and a customer number.
{
"assistantId": "assistant-id",
"phoneNumberId": "phone-number-id",
"customer": {
"number": "+11234567890",
"name": "John Doe",
"numberE164CheckEnabled": true
}
}
For browser-based calls — no phone number needed. Use the Vapi Web SDK on the client side.
{
"assistantId": "assistant-id"
}
Client-side (JavaScript):
import Vapi from "@vapi-ai/web";
const vapi = new Vapi("your-public-key");
vapi.start("your-assistant-id");
Define an assistant inline instead of referencing a saved one:
{
"assistant": {
"name": "Quick Test",
"firstMessage": "Hello! This is a test call.",
"model": {
"provider": "openai",
"model": "gpt-4.1",
"messages": [
{
"role": "system",
"content": "You are a test assistant. Confirm the call is working and end politely."
}
]
},
"voice": { "provider": "vapi", "voiceId": "Elliot", "version": 2 },
"transcriber": { "provider": "deepgram", "model": "nova-3", "language": "en" }
},
"phoneNumberId": "phone-number-id",
"customer": {
"number": "+11234567890"
}
}
Schedule a call for a future time:
{
"assistantId": "assistant-id",
"phoneNumberId": "phone-number-id",
"customer": {
"number": "+11234567890"
},
"schedulePlan": {
"earliestAt": "2025-06-15T14:00:00Z",
"latestAt": "2025-06-15T15:00:00Z"
}
}
earliestAt — Earliest time to attempt the call (ISO 8601)latestAt — Latest time to attempt the call (optional)assistantId, the latest version of the assistant is used at call timeassistant (transient) insteadCall multiple numbers in one request:
{
"assistantId": "assistant-id",
"phoneNumberId": "phone-number-id",
"customers": [
{ "number": "+11234567890", "name": "Alice" },
{ "number": "+10987654321", "name": "Bob" },
{ "number": "+15551234567", "name": "Carol" }
]
}
Combine with schedulePlan for scheduled batch calls.
Pass custom data accessible during the call:
{
"assistantId": "assistant-id",
"phoneNumberId": "phone-number-id",
"customer": {
"number": "+11234567890"
},
"metadata": {
"orderId": "ORD-12345",
"department": "billing"
}
}
# List calls
curl "https://api.vapi.ai/call?limit=10" \
-H "Authorization: Bearer $VAPI_API_KEY"
# Get a specific call
curl https://api.vapi.ai/call/{id} \
-H "Authorization: Bearer $VAPI_API_KEY"
# Get call with transcript and recording
curl https://api.vapi.ai/call/{id} \
-H "Authorization: Bearer $VAPI_API_KEY"
# Response includes: artifact.transcript, artifact.recordingUrl,
# analysis.summary, and costBreakdown when those outputs are enabled
# Delete a call
curl -X DELETE https://api.vapi.ai/call/{id} \
-H "Authorization: Bearer $VAPI_API_KEY"
A successful call creation returns:
{
"id": "call-uuid",
"orgId": "org-uuid",
"type": "outboundPhoneCall",
"status": "queued",
"assistantId": "assistant-id",
"phoneNumberId": "phone-number-id",
"customer": {
"number": "+11234567890"
},
"createdAt": "2025-01-15T10:00:00Z"
}
Call statuses: queued → ringing → in-progress → ended
It is a violation of FCC law to dial phone numbers without consent in an automated manner. Review TCPA consent requirements before launching automated call campaigns.
Vapi provides a documentation MCP server that gives compatible AI agents access to the Vapi knowledge base. Use its documentation search for advanced configuration, troubleshooting, SDK details, and anything beyond this skill.
Manual setup: If your agent doesn't auto-detect the config, run:
claude mcp add vapi-docs -- npx -y mcp-remote https://docs.vapi.ai/_mcp/server
See the Vapi MCP integration guide for setup instructions across supported agents.
npx claudepluginhub vapiai/skills --plugin vapi-voice-aiSet up and manage phone numbers in Vapi for inbound/outbound voice AI calls. Import from Twilio, Vonage, Telnyx, buy Vapi numbers, assign assistants, and configure call hooks.
Makes AI-powered phone calls via Bland AI to book restaurants, schedule appointments, and inquire about services. Returns transcripts and summaries.
Makes outbound phone calls via Twilio's Programmable Voice REST API. Covers calls.create(), AMD, conference bridging, call recording, status tracking, and SIP Trunking.