Vapi Platform Skill
Manage the full Vapi voice AI platform through CLI scripts wrapping the REST API (https://api.vapi.ai).
Authentication
| Key |
Env Variable |
Use For |
| Private Key |
VAPI_PRIVATE_API_KEY |
All API operations (required) |
| Public Key |
VAPI_PUBLIC_API_KEY |
Client-side SDK only |
Add to .env:
VAPI_PRIVATE_API_KEY=your-private-key-here
Scripts auto-load from .env using grep (not source). Override path with VAPI_ENV_FILE=/path/to/.env.
CLI Scripts
All scripts live in .claude/skills/vapi-platform/scripts/. Each handles one resource type with subcommands.
Quick Reference
| Script |
Resource |
Operations |
vapi-assistants.sh |
Assistants |
list, list-summary, get, create, update, delete |
vapi-calls.sh |
Calls |
list, get, create, update, delete |
vapi-phone-numbers.sh |
Phone Numbers |
list, list-summary, get, create, update, delete |
vapi-squads.sh |
Squads |
list, list-summary, get, create, update, delete |
vapi-tools.sh |
Tools |
list, list-summary, get, create, update, delete |
vapi-files.sh |
Files |
list, list-summary, get, upload, delete |
vapi-knowledge-bases.sh |
Knowledge Bases |
list, list-summary, get, create, update, delete |
vapi-blocks.sh |
Blocks |
list, list-summary, get, create, update, delete |
vapi-sessions.sh |
Sessions |
list, get, create |
vapi-chats.sh |
Chats |
list, create |
vapi-campaigns.sh |
Campaigns |
list, list-summary, get, create, update |
vapi-logs.sh |
Logs |
list, get |
vapi-evals.sh |
Evals |
list, list-summary, get, create, update, delete |
vapi-eval-runs.sh |
Eval Runs |
list, list-summary, get, run, poll |
Usage Pattern
SCRIPTS=".claude/skills/vapi-platform/scripts"
# List resources
bash $SCRIPTS/vapi-assistants.sh list
bash $SCRIPTS/vapi-assistants.sh list-summary
# Get by ID
bash $SCRIPTS/vapi-assistants.sh get <id>
# Create (pass JSON body)
bash $SCRIPTS/vapi-assistants.sh create '{"name": "My Assistant", ...}'
# Update (pass ID + JSON body)
bash $SCRIPTS/vapi-assistants.sh update <id> '{"name": "New Name"}'
# Delete
bash $SCRIPTS/vapi-assistants.sh delete <id>
# Upload file (special case)
bash $SCRIPTS/vapi-files.sh upload /path/to/document.pdf
# Filter with query params
bash $SCRIPTS/vapi-logs.sh list "limit=10" "createdAtGt=2026-01-01T00:00:00Z"
Common Workflows
Create an assistant and make a call:
# 1. Create assistant
bash $SCRIPTS/vapi-assistants.sh create '{
"name": "Receptionist",
"firstMessage": "Hello! How can I help?",
"transcriber": {"provider": "deepgram", "model": "nova-3", "language": "en"},
"model": {"provider": "openai", "model": "gpt-4o", "systemPrompt": "You are a helpful receptionist."},
"voice": {"provider": "11labs", "voiceId": "rachel"}
}'
# 2. List phone numbers
bash $SCRIPTS/vapi-phone-numbers.sh list-summary
# 3. Make outbound call
bash $SCRIPTS/vapi-calls.sh create '{
"assistantId": "ASSISTANT_ID",
"phoneNumberId": "PHONE_NUMBER_ID",
"customer": {"number": "+1XXXXXXXXXX"}
}'
Batch outbound calls:
bash $SCRIPTS/vapi-calls.sh create '{
"assistantId": "ASSISTANT_ID",
"phoneNumberId": "PHONE_NUMBER_ID",
"customers": [{"number": "+1XXXXXXXXXX"}, {"number": "+1YYYYYYYYYY"}]
}'
Scheduled call:
bash $SCRIPTS/vapi-calls.sh create '{
"assistantId": "ASSISTANT_ID",
"phoneNumberId": "PHONE_NUMBER_ID",
"customer": {"number": "+1XXXXXXXXXX"},
"schedulePlan": {"earliestAt": "2026-03-01T10:00:00Z", "latestAt": "2026-03-01T12:00:00Z"}
}'
Web call (no phone number):
bash $SCRIPTS/vapi-calls.sh create '{"assistantId": "ASSISTANT_ID", "type": "webCall"}'
Import Twilio number:
bash $SCRIPTS/vapi-phone-numbers.sh create '{
"provider": "twilio",
"number": "+1XXXXXXXXXX",
"twilioAccountSid": "AC...",
"twilioAuthToken": "TOKEN",
"assistantId": "ASSISTANT_ID"
}'
Create function tool:
bash $SCRIPTS/vapi-tools.sh create '{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather for a location",
"parameters": {
"type": "object",
"properties": {"location": {"type": "string", "description": "City name"}},
"required": ["location"]
}
},
"server": {"url": "https://your-server.com/api/weather"}
}'
Upload file and create knowledge base:
bash $SCRIPTS/vapi-files.sh upload /path/to/faq.pdf
bash $SCRIPTS/vapi-knowledge-bases.sh create '{
"name": "Product FAQ",
"fileIds": ["FILE_ID_1"],
"provider": "google"
}'
Create multi-assistant squad:
bash $SCRIPTS/vapi-squads.sh create '{
"name": "Customer Service Squad",
"members": [{"assistantId": "GREETER_ID"}, {"assistantId": "BOOKING_ID"}]
}'
Create eval and run it against an assistant:
# 1. Create an eval definition
bash $SCRIPTS/vapi-evals.sh create '{
"name": "Greeting test",
"type": "chat.mockConversation",
"messages": [
{"role": "user", "content": "Hello"},
{
"role": "assistant",
"judgePlan": {
"type": "ai",
"model": {
"provider": "openai",
"model": "gpt-4o",
"messages": [{"role": "system", "content": "Did the assistant greet warmly and offer help? Output pass or fail."}]
}
}
}
]
}'
# 2. Run eval against assistant (type: "eval" is required)
bash $SCRIPTS/vapi-eval-runs.sh run '{
"type": "eval",
"evalId": "EVAL_ID",
"target": {"type": "assistant", "assistantId": "ASSISTANT_ID"}
}'
# 3. Poll for results
bash $SCRIPTS/vapi-eval-runs.sh poll <RUN_ID>
Run inline eval (without saving, type: "eval" is always required):
bash $SCRIPTS/vapi-eval-runs.sh run '{
"type": "eval",
"eval": {
"type": "chat.mockConversation",
"messages": [
{"role": "user", "content": "Book me for tomorrow at 10am"},
{
"role": "assistant",
"judgePlan": {
"type": "exact",
"toolCalls": [{"name": "bookAppointment", "arguments": {"date": "2026-03-07", "time": "10:00"}}]
}
}
]
},
"target": {"type": "assistant", "assistantId": "ASSISTANT_ID"}
}'
Argument Handling
When the user provides arguments like /vapi list assistants, map to scripts:
list {resource} → bash $SCRIPTS/vapi-{resource}.sh list
get {resource} {id} → bash $SCRIPTS/vapi-{resource}.sh get {id}
create {resource} → Guide through creation, then bash $SCRIPTS/vapi-{resource}.sh create '<json>'
update {resource} {id} → Guide through update, then bash $SCRIPTS/vapi-{resource}.sh update {id} '<json>'
delete {resource} {id} → Confirm, then bash $SCRIPTS/vapi-{resource}.sh delete {id}
call {number} → Create outbound call (ask for assistant/phone number IDs)
status → bash $SCRIPTS/vapi-calls.sh list + bash $SCRIPTS/vapi-assistants.sh list-summary
Operational Guidelines
- Scripts use
grep-based key loading — not source .env (avoids side effects from other env vars)
- Always use the Private Key (
$VAPI_PRIVATE_API_KEY) — public key can list but not get/mutate
- PATCH replaces nested objects entirely — when updating any field inside
model (e.g., temperature, provider), you MUST include the full model object including messages, toolIds, etc. Otherwise they get wiped. Top-level fields (firstMessage, voice, transcriber) are safe to patch individually.
- Always GET before PATCH — fetch the current assistant config first, then merge your changes into the full object before sending the update
- Confirm destructive operations (delete) before executing
- Validate IDs look like UUIDs before making requests
- Use
list-summary for quick overviews, list for full JSON
- Never expose the API key in output or logs
- On 401 errors — verify using Private Key, check
.env file has the key
Configuration Reference
For detailed schemas, voice pipeline config, transcribers, LLM providers, TTS providers, hooks, and analysis plans:
- api-reference.md — Full endpoint schemas and response formats
- configuration-guide.md — Voice pipeline, hooks, analysis plans
Provider Quick Reference
Transcribers (STT): deepgram (nova-3), assembly-ai, azure, gladia, google, elevenlabs, openai (whisper), speechmatics, custom
LLM: openai (gpt-4o, gpt-4o-mini), anthropic (claude-3-5-sonnet), google (gemini-1.5-pro), groq (llama, mixtral), custom
Voice/TTS: 11labs, playht, azure, deepgram, lmnt, cartesia, rime, neets, custom
Telephony: twilio, vonage, telnyx, vapi (built-in, limited)
1---2name: vapi3description: Manages the Vapi voice AI platform API. Use when the user wants to create, list, update, or delete Vapi resources (assistants, calls, phone numbers, squads, tools, files, knowledge bases, blocks, sessions, campaigns, logs, evals, eval runs), make outbound calls, configure voice pipelines, run eval tests against assistants, or manage their Vapi account. Handles all CRUD operations against the Vapi REST API.4---56# Vapi Platform Skill78Manage the full Vapi voice AI platform through CLI scripts wrapping the REST API (`https://api.vapi.ai`).910## Authentication1112| Key | Env Variable | Use For |13|-----|-------------|---------|14| **Private Key** | `VAPI_PRIVATE_API_KEY` | All API operations (required) |15| **Public Key** | `VAPI_PUBLIC_API_KEY` | Client-side SDK only |1617Add to `.env`:18```19VAPI_PRIVATE_API_KEY=your-private-key-here20```2122Scripts auto-load from `.env` using `grep` (not `source`). Override path with `VAPI_ENV_FILE=/path/to/.env`.2324## CLI Scripts2526All scripts live in `.claude/skills/vapi-platform/scripts/`. Each handles one resource type with subcommands.2728### Quick Reference2930| Script | Resource | Operations |31|--------|----------|------------|32| `vapi-assistants.sh` | Assistants | list, list-summary, get, create, update, delete |33| `vapi-calls.sh` | Calls | list, get, create, update, delete |34| `vapi-phone-numbers.sh` | Phone Numbers | list, list-summary, get, create, update, delete |35| `vapi-squads.sh` | Squads | list, list-summary, get, create, update, delete |36| `vapi-tools.sh` | Tools | list, list-summary, get, create, update, delete |37| `vapi-files.sh` | Files | list, list-summary, get, upload, delete |38| `vapi-knowledge-bases.sh` | Knowledge Bases | list, list-summary, get, create, update, delete |39| `vapi-blocks.sh` | Blocks | list, list-summary, get, create, update, delete |40| `vapi-sessions.sh` | Sessions | list, get, create |41| `vapi-chats.sh` | Chats | list, create |42| `vapi-campaigns.sh` | Campaigns | list, list-summary, get, create, update |43| `vapi-logs.sh` | Logs | list, get |44| `vapi-evals.sh` | Evals | list, list-summary, get, create, update, delete |45| `vapi-eval-runs.sh` | Eval Runs | list, list-summary, get, run, poll |4647### Usage Pattern4849```bash50SCRIPTS=".claude/skills/vapi-platform/scripts"5152# List resources53bash $SCRIPTS/vapi-assistants.sh list54bash $SCRIPTS/vapi-assistants.sh list-summary5556# Get by ID57bash $SCRIPTS/vapi-assistants.sh get <id>5859# Create (pass JSON body)60bash $SCRIPTS/vapi-assistants.sh create '{"name": "My Assistant", ...}'6162# Update (pass ID + JSON body)63bash $SCRIPTS/vapi-assistants.sh update <id> '{"name": "New Name"}'6465# Delete66bash $SCRIPTS/vapi-assistants.sh delete <id>6768# Upload file (special case)69bash $SCRIPTS/vapi-files.sh upload /path/to/document.pdf7071# Filter with query params72bash $SCRIPTS/vapi-logs.sh list "limit=10" "createdAtGt=2026-01-01T00:00:00Z"73```7475### Common Workflows7677**Create an assistant and make a call:**78```bash79# 1. Create assistant80bash $SCRIPTS/vapi-assistants.sh create '{81 "name": "Receptionist",82 "firstMessage": "Hello! How can I help?",83 "transcriber": {"provider": "deepgram", "model": "nova-3", "language": "en"},84 "model": {"provider": "openai", "model": "gpt-4o", "systemPrompt": "You are a helpful receptionist."},85 "voice": {"provider": "11labs", "voiceId": "rachel"}86}'8788# 2. List phone numbers89bash $SCRIPTS/vapi-phone-numbers.sh list-summary9091# 3. Make outbound call92bash $SCRIPTS/vapi-calls.sh create '{93 "assistantId": "ASSISTANT_ID",94 "phoneNumberId": "PHONE_NUMBER_ID",95 "customer": {"number": "+1XXXXXXXXXX"}96}'97```9899**Batch outbound calls:**100```bash101bash $SCRIPTS/vapi-calls.sh create '{102 "assistantId": "ASSISTANT_ID",103 "phoneNumberId": "PHONE_NUMBER_ID",104 "customers": [{"number": "+1XXXXXXXXXX"}, {"number": "+1YYYYYYYYYY"}]105}'106```107108**Scheduled call:**109```bash110bash $SCRIPTS/vapi-calls.sh create '{111 "assistantId": "ASSISTANT_ID",112 "phoneNumberId": "PHONE_NUMBER_ID",113 "customer": {"number": "+1XXXXXXXXXX"},114 "schedulePlan": {"earliestAt": "2026-03-01T10:00:00Z", "latestAt": "2026-03-01T12:00:00Z"}115}'116```117118**Web call (no phone number):**119```bash120bash $SCRIPTS/vapi-calls.sh create '{"assistantId": "ASSISTANT_ID", "type": "webCall"}'121```122123**Import Twilio number:**124```bash125bash $SCRIPTS/vapi-phone-numbers.sh create '{126 "provider": "twilio",127 "number": "+1XXXXXXXXXX",128 "twilioAccountSid": "AC...",129 "twilioAuthToken": "TOKEN",130 "assistantId": "ASSISTANT_ID"131}'132```133134**Create function tool:**135```bash136bash $SCRIPTS/vapi-tools.sh create '{137 "type": "function",138 "function": {139 "name": "get_weather",140 "description": "Get weather for a location",141 "parameters": {142 "type": "object",143 "properties": {"location": {"type": "string", "description": "City name"}},144 "required": ["location"]145 }146 },147 "server": {"url": "https://your-server.com/api/weather"}148}'149```150151**Upload file and create knowledge base:**152```bash153bash $SCRIPTS/vapi-files.sh upload /path/to/faq.pdf154bash $SCRIPTS/vapi-knowledge-bases.sh create '{155 "name": "Product FAQ",156 "fileIds": ["FILE_ID_1"],157 "provider": "google"158}'159```160161**Create multi-assistant squad:**162```bash163bash $SCRIPTS/vapi-squads.sh create '{164 "name": "Customer Service Squad",165 "members": [{"assistantId": "GREETER_ID"}, {"assistantId": "BOOKING_ID"}]166}'167```168169**Create eval and run it against an assistant:**170```bash171# 1. Create an eval definition172bash $SCRIPTS/vapi-evals.sh create '{173 "name": "Greeting test",174 "type": "chat.mockConversation",175 "messages": [176 {"role": "user", "content": "Hello"},177 {178 "role": "assistant",179 "judgePlan": {180 "type": "ai",181 "model": {182 "provider": "openai",183 "model": "gpt-4o",184 "messages": [{"role": "system", "content": "Did the assistant greet warmly and offer help? Output pass or fail."}]185 }186 }187 }188 ]189}'190191# 2. Run eval against assistant (type: "eval" is required)192bash $SCRIPTS/vapi-eval-runs.sh run '{193 "type": "eval",194 "evalId": "EVAL_ID",195 "target": {"type": "assistant", "assistantId": "ASSISTANT_ID"}196}'197198# 3. Poll for results199bash $SCRIPTS/vapi-eval-runs.sh poll <RUN_ID>200```201202**Run inline eval (without saving, type: "eval" is always required):**203```bash204bash $SCRIPTS/vapi-eval-runs.sh run '{205 "type": "eval",206 "eval": {207 "type": "chat.mockConversation",208 "messages": [209 {"role": "user", "content": "Book me for tomorrow at 10am"},210 {211 "role": "assistant",212 "judgePlan": {213 "type": "exact",214 "toolCalls": [{"name": "bookAppointment", "arguments": {"date": "2026-03-07", "time": "10:00"}}]215 }216 }217 ]218 },219 "target": {"type": "assistant", "assistantId": "ASSISTANT_ID"}220}'221```222223## Argument Handling224225When the user provides arguments like `/vapi list assistants`, map to scripts:226- `list {resource}` → `bash $SCRIPTS/vapi-{resource}.sh list`227- `get {resource} {id}` → `bash $SCRIPTS/vapi-{resource}.sh get {id}`228- `create {resource}` → Guide through creation, then `bash $SCRIPTS/vapi-{resource}.sh create '<json>'`229- `update {resource} {id}` → Guide through update, then `bash $SCRIPTS/vapi-{resource}.sh update {id} '<json>'`230- `delete {resource} {id}` → Confirm, then `bash $SCRIPTS/vapi-{resource}.sh delete {id}`231- `call {number}` → Create outbound call (ask for assistant/phone number IDs)232- `status` → `bash $SCRIPTS/vapi-calls.sh list` + `bash $SCRIPTS/vapi-assistants.sh list-summary`233234## Operational Guidelines2352361. **Scripts use `grep`-based key loading** — not `source .env` (avoids side effects from other env vars)2372. **Always use the Private Key** (`$VAPI_PRIVATE_API_KEY`) — public key can list but not get/mutate2383. **PATCH replaces nested objects entirely** — when updating any field inside `model` (e.g., temperature, provider), you MUST include the **full `model` object** including `messages`, `toolIds`, etc. Otherwise they get wiped. Top-level fields (`firstMessage`, `voice`, `transcriber`) are safe to patch individually.2394. **Always GET before PATCH** — fetch the current assistant config first, then merge your changes into the full object before sending the update2405. **Confirm destructive operations** (delete) before executing2416. **Validate IDs** look like UUIDs before making requests2427. **Use `list-summary`** for quick overviews, `list` for full JSON2438. **Never expose the API key** in output or logs2449. **On 401 errors** — verify using Private Key, check `.env` file has the key245246## Configuration Reference247248For detailed schemas, voice pipeline config, transcribers, LLM providers, TTS providers, hooks, and analysis plans:249- [api-reference.md](references/api-reference.md) — Full endpoint schemas and response formats250- [configuration-guide.md](references/configuration-guide.md) — Voice pipeline, hooks, analysis plans251252## Provider Quick Reference253254**Transcribers (STT):** `deepgram` (nova-3), `assembly-ai`, `azure`, `gladia`, `google`, `elevenlabs`, `openai` (whisper), `speechmatics`, `custom`255256**LLM:** `openai` (gpt-4o, gpt-4o-mini), `anthropic` (claude-3-5-sonnet), `google` (gemini-1.5-pro), `groq` (llama, mixtral), `custom`257258**Voice/TTS:** `11labs`, `playht`, `azure`, `deepgram`, `lmnt`, `cartesia`, `rime`, `neets`, `custom`259260**Telephony:** `twilio`, `vonage`, `telnyx`, `vapi` (built-in, limited)