Skip to content
Guides

A phone number for OpenClaw voice calls

Twilio, Telnyx or Plivo, the from-number, the public webhook, and the setup check

5 min read

The question behind the search for the best voice number for OpenClaw has a plain answer in the docs: the number comes from one of three carriers the voice-call plugin supports, Twilio, Telnyx or Plivo, and the docs do not rank them. The plugin places outbound calls and accepts inbound ones, runs full-duplex realtime voice and streaming transcription, and applies allowlist policies to callers. Here is what it needs at minimum, why the webhook must be public, the two commands that check the setup, and the session rules.

What the plugin needs

  • Install the plugin on the machine that runs the Gateway, because it runs inside the Gateway process; a remote Gateway means installing it there.
  • At minimum in its config: the provider, the provider’s credentials, the from-number, and a publicly reachable webhook URL; with several agents, the agent that owns calls.
  • For an inbound Twilio number, set its voice webhook to the plugin’s public URL with the POST method, and the number-level status callback to the same URL with a status type so terminal call statuses reach the plugin.
For Twilio, Telnyx, and Plivo, setup must resolve to a public webhook URL.

Why public

Carriers deliver call events by calling your webhook, so if the public URL, a tunnel URL, the Tailscale URL or the serve fallback resolves to loopback or private address space, setup fails rather than starting a provider that cannot receive carrier webhooks. That is the one place in OpenClaw where a public endpoint is not optional, and the plugin’s configuration page has a section on provider exposure and the security notes that go with it.

Checking it

  • The setup command checks plugin enablement, provider credentials, webhook exposure, agent ownership, and that only one audio mode, streaming or realtime, is active; a JSON flag prints the same for scripts.
  • The smoke command is a dry run by default, with or without a destination number; a yes flag places a short outbound notification call for real.
  • Providers in the docs: a mock for development without network, Plivo with its voice API and speech input, Telnyx call control, and Twilio programmable voice with media streams.

OpenClaw voice calls explains what a call can do once connected, and OpenClaw text to speech the synthesis that becomes the voice on the line.

Sessions per caller

The session scope decides whether a caller is remembered: per phone keeps conversation memory for the same caller, per call starts each carrier call fresh, which the docs suggest for reception, booking and IVR flows where the same number may mean different people, and main routes every call into the agent’s primary session, to be used only when that shared context is intentional. OpenClaw and Tailscale is the usual way to give the Gateway a public HTTPS address for the webhook without opening the rest.

On Diali

On Diali the voice channel is part of the connect list: the carrier account and the number are yours, the plugin, the webhook exposure and the Gateway are ours. Voice on Diali is the channel page and Hosted OpenClaw on Diali the assistant.

  • Twilio, Telnyx or Plivo; the docs do not pick one.
  • The webhook must be public, or setup refuses to start.
  • Per phone remembers a caller; per call forgets on purpose.
Get started

Stop reading about it, build one

Set up an agent, pick a channel, and have it working inside the app you already keep open.