Skip to main content

openclaw voicecall

voicecall is a plugin-provided command. It only appears when the voice-call plugin is installed and enabled. When the Gateway is running, operational commands (call, start, continue, speak, dtmf, end, status) route to that Gateway’s voice-call runtime. If no Gateway is reachable, they fall back to a standalone CLI runtime. status uses the persisted call store instead of starting that runtime. Fallback is limited to transport-level absence. If the Gateway responds with a request or authentication error, or does not answer before the timeout, the command exits nonzero and points to openclaw gateway status; it does not start a second webhook server. If standalone fallback cannot bind the configured serve.port, the error identifies the likely running Gateway instead of printing a raw EADDRINUSE failure.

Subcommands

Setup and smoke

setup

Prints human-readable readiness checks by default. Pass --json for scripts.

smoke

Runs the same readiness checks. Places a real phone call only when both --to and --yes are present.
For external providers (plivo, telnyx, twilio), setup and smoke require a public webhook URL from publicUrl, a tunnel, or Tailscale exposure. A loopback or private serve fallback is rejected because carriers cannot reach it.

Call lifecycle

call

Initiate an outbound voice call.

start

Alias for call with a different default flag shape.

continue

Speak a message and wait for a response.

speak

Speak a message without waiting for a response.

dtmf

Send DTMF digits to an active call.

end

Hang up an active call.

status

Inspect active calls.

Logs and metrics

tail

Tail persisted voice-call records from SQLite: print the last --since records initially, then only new snapshots (--since 0 starts with new snapshots only). With an existing custom --file whose basename is not calls.jsonl, prints the last --since nonempty complete lines on start, then streams new complete lines. Partial lines wait for a newline; file replacement or observed truncation starts a fresh stream. Slow output pipes pause reading instead of accumulating the rest of the log in memory.

latency

Summarize turn-latency and listen-wait metrics from SQLite or an existing custom log selected with --file. Output is JSON with recordsScanned, turnLatency, and listenWait summaries. Custom logs are scanned incrementally without a byte cap on requested history. latency selects the last N nonempty records, skips malformed JSON, and accepts a final JSON record without a newline. It parses one selected record at a time; memory still scales with the largest selected JSON record and the requested number of metric samples.

Exposing webhooks

expose

Enable, disable, or change the Tailscale serve/funnel configuration for the voice webhook. When realtime or streaming audio is enabled, the command also exposes or clears that mode’s WebSocket stream path. The external HTTPS port comes from tailscale.port (default 443); Funnel supports 443, 8443, or 10000.
Only expose the webhook endpoint to networks you trust. Prefer Tailscale Serve over Funnel when possible.