Voice Call

OpenClaw voice-call plugin. Enable voice conversations with your AI agent.

The Voice Call plugin turns OpenClaw into a telephone-capable AI agent — your assistant can make and receive actual phone calls via Twilio, Telnyx, or Plivo. This is the 'call your Jarvis' feature: outbound notifications ("Hey, your deploy failed"), multi-turn voice conversations, and inbound call handling with allowlists and auto-responses. The architecture is STT → LLM → TTS running inside the OpenClaw gateway process. For Twilio, it uses Programmable Voice + Media Streams for real-time bidirectional audio. Telnyx uses Call Control v2. Plivo uses its Voice API with XML transfer and GetInput speech. A mock provider exists for local development without network calls. The plugin requires a publicly reachable webhook URL (via ngrok, Cloudflare Tunnel, or Tailscale Funnel) so telephony providers can deliver call events. TTS for voice calls deep-merges with the core `messages.tts` configuration, supporting ElevenLabs, OpenAI, and other providers. You can override TTS just for calls while keeping a different voice for text channels. Streaming TTS is supported when Twilio media streams are active, enabling real-time spoken responses during conversation. Inbound calls use an allowlist policy with caller-ID filtering (not strong identity verification). Auto-responses use the agent system with configurable model, system prompt, and timeout. The plugin extracts speech from a strict `{"spoken":"..."}` JSON contract, defensively parsing agent output for telephony playback. This is one of the most impressive OpenClaw capabilities — having your AI agent literally call you on the phone. Community reports confirm it works well for structured notifications and simple conversations, though latency-sensitive use cases may benefit from dedicated voice AI platforms like LiveKit or Pipecat.

Tags: voice, audio, communication

Use Cases

  • AI agent calls you when something important happens — deploy failures, urgent emails, security alerts
  • Phone-based AI assistant you can call for hands-free help while driving or walking
  • Automated outbound notification calls for appointment reminders, status updates, or check-ins
  • Voice-based customer support prototype using OpenClaw as the conversational backend
  • Accessibility interface for users who prefer voice interaction over text-based chat
  • Emergency notification system that calls designated numbers when triggered by monitored events

Tips

  • Start with the mock provider to test the call flow locally before connecting to Twilio/Telnyx/Plivo
  • Use ElevenLabs for TTS with the voice-call config override for the most natural-sounding phone voice
  • Set up Tailscale Funnel for the most reliable and free webhook exposure — no URL rotation like ngrok free tier
  • Configure staleCallReaperSeconds (120-300) in production to clean up calls that never receive terminal webhooks
  • Use notify mode for one-way announcements (deploy alerts, reminders) and conversation mode for interactive calls
  • Override TTS just for calls while keeping a different voice for text channels using the plugin-level tts config
  • Enable webhookSecurity.allowedHosts when using a proxy or tunnel in front of the Gateway
  • Test inbound calls with a small allowFrom list before opening up broader access

Known Issues & Gotchas

  • The plugin runs INSIDE the Gateway process — install and configure on the machine running the Gateway, then restart
  • Twilio/Telnyx/Plivo all require a publicly reachable webhook URL — set up ngrok, Cloudflare Tunnel, or Tailscale Funnel first
  • Ngrok free tier URLs change on restart — use publicUrl config to set the exact URL, and beware of signature verification failures
  • For Telnyx, you must set telnyx.publicKey (or TELNYX_PUBLIC_KEY env var) unless skipSignatureVerification is true (dev only)
  • Streaming security has connection limits (maxPendingConnections, maxConnections) that may need tuning for multi-call scenarios
  • staleCallReaperSeconds should be higher than maxDurationSeconds — set it to maxDuration + 30-60 seconds
  • tunnel.allowNgrokFreeTierLoopbackBypass is for local dev only — never enable in production
  • If TTS provider is unavailable during an active Twilio media stream, the call will fail rather than falling back to <Say>

Alternatives

  • ElevenLabs Agents
  • Deepgram + Telnyx (deepclaw)
  • Talk Mode (OpenClaw desktop)

Community Feedback

Believe it or not, users started reporting that their agents were calling them before there was even official support! The agents secretly figured out how to connect to Twilio and TTS providers.

— Medium

Now there's an official OpenClaw plugin for this. It works with Plivo, Twilio, and Telnyx. It's basic, but great for experimenting — kind of like a simple version of what LiveKit or Pipecat pipelines do.

— Medium

It actually worked pretty well for structured actions during a call. Curious if anyone else here has tried something similar.

— Reddit r/AIAgentsStack

OpenClaw is fantastic, but right now, it's mostly hacky and low-level — definitely aimed at tech people.

— Medium

Frequently Asked Questions

Which telephony provider should I choose — Twilio, Telnyx, or Plivo?

Twilio is the most widely used and documented, with the best OpenClaw integration (Media Streams for real-time audio). Telnyx offers competitive pricing and good call quality. Plivo is another solid option. Start with Twilio unless you have a specific reason to choose another.

Do I need a public URL for voice calls?

Yes. All three providers (Twilio, Telnyx, Plivo) deliver call events via webhooks to a publicly reachable HTTPS URL. Use ngrok, Cloudflare Tunnel, or Tailscale Funnel for local development. For production, use a stable domain.

How much does it cost to make voice calls?

Costs depend on your telephony provider. Twilio charges ~$0.013/min for outbound US calls. Telnyx is often cheaper. Plus you'll pay for TTS (ElevenLabs, OpenAI) and STT processing. A 5-minute call might cost $0.10-$0.50 depending on providers.

Can my OpenClaw agent call me proactively?

Yes! Use outbound notify mode for one-way announcements or conversation mode for interactive calls. Configure via the voice_call tool or openclaw voicecall CLI command. Pair with cron jobs to schedule regular check-in calls.

Can I receive inbound calls from my phone?

Yes. Set inboundPolicy to 'allowlist' and add your phone number to allowFrom. The plugin will answer with your configured greeting and route the conversation to your OpenClaw agent. Note that caller-ID filtering is low-assurance.

What TTS provider works best for phone calls?

ElevenLabs produces the most natural voice quality for telephony. OpenAI TTS is also good. Microsoft speech is NOT supported for voice calls (telephony needs PCM audio format). Configure TTS under the plugin's config.tts to override just for calls.

Is the voice quality good enough for real conversations?

For structured actions and notifications, it works well. For longer conversations, expect some latency in the STT→LLM→TTS pipeline. Dedicated voice AI platforms (LiveKit, Pipecat, ElevenLabs Agents) offer lower latency for real-time conversation.

Configuration Examples

Twilio Voice Call Setup

plugins:
  entries:
    voice-call:
      enabled: true
      config:
        provider: twilio
        fromNumber: '+15550001234'
        toNumber: '+15550005678'
        twilio:
          accountSid: ${TWILIO_ACCOUNT_SID}
          authToken: ${TWILIO_AUTH_TOKEN}
        serve:
          port: 3334
          path: /voice/webhook
        publicUrl: https://voice.example.com/voice/webhook
        webhookSecurity:
          allowedHosts:
            - voice.example.com
        streaming:
          enabled: true
          streamPath: /voice/stream

Telnyx Provider Configuration

plugins:
  entries:
    voice-call:
      enabled: true
      config:
        provider: telnyx
        fromNumber: '+15550001234'
        toNumber: '+15550005678'
        telnyx:
          apiKey: ${TELNYX_API_KEY}
          connectionId: ${TELNYX_CONNECTION_ID}
          publicKey: ${TELNYX_PUBLIC_KEY}
        serve:
          port: 3334
          path: /voice/webhook

Voice Call with ElevenLabs TTS Override

plugins:
  entries:
    voice-call:
      enabled: true
      config:
        provider: twilio
        fromNumber: '+15550001234'
        twilio:
          accountSid: ${TWILIO_ACCOUNT_SID}
          authToken: ${TWILIO_AUTH_TOKEN}
        tts:
          provider: elevenlabs
          elevenlabs:
            apiKey: ${ELEVENLABS_API_KEY}
            voiceId: pMsXgVXv3BLzUgSXRplE
            modelId: eleven_multilingual_v2
        outbound:
          defaultMode: conversation

Inbound Call Handling

plugins:
  entries:
    voice-call:
      enabled: true
      config:
        provider: twilio
        fromNumber: '+15550001234'
        twilio:
          accountSid: ${TWILIO_ACCOUNT_SID}
          authToken: ${TWILIO_AUTH_TOKEN}
        inboundPolicy: allowlist
        allowFrom:
          - '+15550009999'
        inboundGreeting: 'Hello! How can I help you today?'
        responseTimeoutMs: 30000
        maxDurationSeconds: 300
        staleCallReaperSeconds: 360

Installation

openclaw plugins install @openclaw/voice-call