Install
openclaw skills install supercallClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
Make AI-powered phone calls with custom personas and goals. Uses OpenAI Realtime API + Twilio for ultra-low latency voice conversations. Supports DTMF/IVR navigation — the AI can navigate automated phone menus by sending touch-tone digits. Use when you need to call someone, confirm appointments, deliver messages, navigate phone trees, or have the AI handle phone conversations autonomously. Unlike the standard voice_call plugin, the person on the call doesn't have access to gateway agent, reducing attack surfaces.
openclaw skills install supercallMake AI-powered phone calls with custom personas and goals using OpenAI Realtime API + Twilio.
| Credential | Source | Purpose |
|---|---|---|
OPENAI_API_KEY | OpenAI | Powers the realtime voice AI (GPT-4o) |
TWILIO_ACCOUNT_SID | Twilio Console | Twilio account identifier |
TWILIO_AUTH_TOKEN | Twilio Console | Twilio API authentication |
| Credential | Source | Purpose |
|---|---|---|
NGROK_AUTHTOKEN | ngrok | ngrok tunnel auth (only needed if using ngrok as tunnel provider) |
Credentials can be set via environment variables or in the plugin config (config takes precedence).
Install the plugin via npm or copy to your OpenClaw extensions directory
Enable hooks for call completion callbacks (required):
{
"hooks": {
"enabled": true,
"token": "your-secret-token"
}
}
Generate a secure token with: openssl rand -hex 24
⚠️ Security: The
hooks.tokenis sensitive — it authenticates internal callbacks. Keep it secret and rotate if compromised.
{
"plugins": {
"entries": {
"supercall": {
"enabled": true,
"config": {
"provider": "twilio",
"fromNumber": "+15551234567",
"twilio": {
"accountSid": "your-account-sid",
"authToken": "your-auth-token"
},
"streaming": {
"openaiApiKey": "your-openai-key"
},
"tunnel": {
"provider": "ngrok",
"ngrokDomain": "your-domain.ngrok.app"
}
}
}
}
}
}
Important: The hooks.token is required for call completion callbacks. Without it, the agent won't be notified when calls finish.
Make phone calls with custom personas:
supercall(
action: "persona_call",
to: "+1234567890",
persona: "Personal assistant to the king",
goal: "Confirm the callee's availabilities for dinner next week",
openingLine: "Hey, this is Michael, Alex's Assistant..."
)
persona_call - Start a new call with a personaget_status - Check call status and transcriptend_call - End an active calllist_calls - List active persona callsThe AI automatically handles automated phone menus (IVR systems) during calls. When it hears prompts like "press 1 for sales", it uses an internal send_dtmf tool to send touch-tone digits through the audio stream. This is fully automatic — no extra configuration or agent intervention is needed.
0-9, *, #, A-D, w (500ms pause)1 (press 1), 1234567890# (enter account number + pound), 1w123# (press 1, wait, then enter 123#)This means persona calls can navigate phone trees end-to-end — e.g., "call the pharmacy, navigate through their menu, and check on my prescription status."
| Option | Description | Default |
|---|---|---|
provider | Voice provider (twilio/mock) | Required |
fromNumber | Caller ID (E.164 format) | Required for real providers |
toNumber | Default recipient number | - |
twilio.accountSid | Twilio Account SID | TWILIO_ACCOUNT_SID env |
twilio.authToken | Twilio Auth Token | TWILIO_AUTH_TOKEN env |
streaming.openaiApiKey | OpenAI API key for realtime | OPENAI_API_KEY env |
streaming.silenceDurationMs | VAD silence duration in ms | 800 |
streaming.vadThreshold | VAD threshold 0-1 (higher = less sensitive) | 0.5 |
streaming.streamPath | WebSocket path for media stream | /voice/stream |
tunnel.provider | Tunnel for webhooks (ngrok/tailscale-serve/tailscale-funnel) | none |
tunnel.ngrokDomain | Fixed ngrok domain (recommended for production) | - |
tunnel.ngrokAuthToken | ngrok auth token | NGROK_AUTHTOKEN env |
| Full realtime requires an OpenAI API key. |
This is a fully standalone skill - it does not depend on the built-in voice-call plugin. All voice calling logic is self-contained.
This plugin is not instruction-only. It runs code, spawns processes, opens network listeners, and writes to disk. The following describes exactly what happens at runtime.
When tunnel.provider is set to ngrok, the plugin spawns the ngrok CLI binary via child_process.spawn. When set to tailscale-serve or tailscale-funnel, it spawns the tailscale CLI instead. These processes run for the lifetime of the plugin and are terminated on shutdown. If tunnel.provider is none (or a publicUrl is provided directly), no external processes are spawned.
0.0.0.0:3335) to receive Twilio webhook callbacks and WebSocket media streams.x-supercall-self-test header to verify connectivity. If publicUrl is misconfigured to point at an unintended endpoint, this self-test token could be sent there. Always verify your publicUrl or tunnel configuration before starting.x-supercall-self-test) generated at startup..ngrok-free.app, .ngrok.io), URL reconstruction may vary due to ngrok's request rewriting; Twilio signature mismatches are logged but allowed through. Paid/custom ngrok domains (.ngrok.app) are verified strictly. This relaxation is limited to free-tier domains only and does not affect Tailscale or direct publicUrl configurations.Call transcripts are persisted to ~/clawd/supercall-logs. These logs may contain sensitive conversation content. Review and rotate logs periodically.
publicUrl or tunnel config points where you expect before startinghooks.token periodically and if you suspect compromise