Enable voice call functionality for OpenClaw agents. Supports Twilio integration for making and receiving phone calls through your AI assistant.
openclaw plugins install @openclaw/voice-call
# @openclaw/voice-call
Official Voice Call plugin for **OpenClaw**.
Providers:
- **Twilio** (Programmable Voice + Media Streams)
- **Telnyx** (Call Control v2)
- **Plivo** (Voice API + XML transfer + GetInput speech)
- **Mock** (dev/no network)
Docs: `https://docs.openclaw.ai/plugins/voice-call`
Plugin system: `https://docs.openclaw.ai/plugin`
## Install (local dev)
### Option A: install via OpenClaw (recommended)
```bash
openclaw plugins install @openclaw/voice-call
Restart the Gateway afterwards.
mkdir -p ~/.openclaw/extensions
cp -R extensions/voice-call ~/.openclaw/extensions/voice-call
cd ~/.openclaw/extensions/voice-call && pnpm install
Put under plugins.entries.voice-call.config:
{
provider: "twilio", // or "telnyx" | "plivo" | "mock"
fromNumber: "+15550001234",
toNumber: "+15550005678",
twilio: {
accountSid: "ACxxxxxxxx",
authToken: "your_token",
},
plivo: {
authId: "MAxxxxxxxxxxxxxxxxxxxx",
authToken: "your_token",
},
// Webhook server
serve: {
port: 3334,
path: "/voice/webhook",
},
// Public exposure (pick one):
// publicUrl: "https://example.ngrok.app/voice/webhook",
// tunnel: { provider: "ngrok" },
// tailscale: { mode: "funnel", path: "/voice/webhook" }
outbound: {
defaultMode: "notify", // or "conversation"
},
streaming: {
enabled: true,
streamPath: "/voice/stream",
},
}
Notes:
mock is a local dev provider (no network calls).tunnel.allowNgrokFreeTierLoopbackBypass: true allows Twilio webhooks with invalid signatures only when tunnel.provider="ngrok" and serve.bind is loopback (ngrok local agent). Use for local dev only.Voice Call uses the core messages.tts configuration (OpenAI or ElevenLabs) for
streaming speech on calls. You can override it under the plugin config with the
same shape — overrides deep-merge with messages.tts.
{
tts: {
provider: "openai",
openai: {
voice: "alloy",
},
},
}
Notes:
openclaw voicecall call --to "+15555550123" --message "Hello from OpenClaw"
openclaw voicecall continue --call-id <id> --message "Any questions?"
openclaw voicecall speak --call-id <id> --message "One moment"
openclaw voicecall end --call-id <id>
openclaw voicecall status --call-id <id>
openclaw voicecall tail
openclaw voicecall expose --mode funnel
Tool name: voice_call
Actions:
initiate_call (message, to?, mode?)continue_call (callId, message)speak_to_user (callId, message)end_call (callId)get_status (callId)voicecall.initiate (to?, message, mode?)voicecall.continue (callId, message)voicecall.speak (callId, message)voicecall.end (callId)voicecall.status (callId)responseModel / responseSystemPrompt control AI auto-responses.ws and OpenAI Realtime API key.