> ## Documentation Index
> Fetch the complete documentation index at: https://plivo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Make and control calls

> Place outbound calls to your agent, transfer a live call to a human, play or record, and start or stop a stream on a live call.

Place an outbound call, inspect it, or control its audio while it is active. [Log in](https://plivo.com/docs/cli/install.md#log-in-with-a-browser), use a caller number on your account, and choose a test recipient:

```bash theme={null}
plivo voice calls make --from +14155550100 --to +14155550101 --dry-run
```

This previews a call that plays Plivo's hello demo. Replace `--dry-run` with `--yes` to place the billed call. To call your voice agent instead, supply its public answer URL, which returns `<Stream>` XML:

```bash theme={null}
plivo voice calls make --from +14155550100 --to +14155550101 \
  --answer-url https://agent.example.com/answer --answer-method POST --dry-run
```

For human handoff, run `plivo voice calls transfer "<call_uuid>" --legs aleg --aleg-url "<url>"`, where the new URL returns `<Dial>` XML.

* Find a call UUID with `plivo voice calls list` after the call ends, or `plivo voice calls list --live` while it is active. A call leg is one side of a connected call (aleg is the caller, bleg the callee). DTMF means keypad tones, and TTS means text-to-speech.
* Replace example numbers, URLs and `<values>` with yours. Omit `[flags]` unless adding options.
* Global flags: see [Configuration](https://plivo.com/docs/cli/configure.md).

## Calls

`voice calls make` spends money and requires `--yes`. Live-call controls (`play`, `speak`, `record`, `dtmf`, `transfer`, `stop-*`) act on an established call and don't need it. `hangup` needs `--yes`, and previews with `--dry-run` alone. With `-o json`, the live-call controls and `hangup` print a result on stdout, such as `{"data": {"call_uuid": "<call_uuid>", "hung_up": true}}`.

### Read a call in progress

`voice calls get` reads the call record, which Plivo writes when the call ends. Add `--live` to read a call still in progress. If the call has already ended, `--live` returns not found.

`voice calls list --live` lists the calls in progress. Plivo returns only their UUIDs, with no filter or paging, so `--live` takes no other list flag. With `-o json` the UUIDs are in `data.calls`.

```bash theme={null}
plivo voice calls get "<call_uuid>" --live
plivo voice calls list --live
```

### Filter the call list by date

`plivo voice calls list` shows the newest calls first. Without a date, Plivo returns the last 7 days.

```bash theme={null}
plivo voice calls list --since 2026-10-01 --until 2026-10-07
plivo voice calls list --since "2026-10-01 09:00" --until 2026-10-07 -o json
plivo voice calls list --since 2026-10-01 --until 2026-10-07 --all          # every page, not just the first 20 rows
```

* `--since` and `--until` filter on when a call ended, in UTC, as `YYYY-MM-DD` or `YYYY-MM-DD HH:MM[:SS]`. `--from-date` and `--to-date` are the same flags.
* A bare `--until` date includes that whole day. `--until` needs `--since`.
* Plivo searches only the last 90 days, at most 31 days per request. A range outside either limit is refused before any request, and the error says what to run instead, such as the ranges to split it into.

| Usage | What it does |
| - | - |
| `plivo voice calls make [flags]` | Make an outbound call (requires --yes; spends money: use --dry-run to preview) |
| `plivo voice calls list [flags]` | List calls (paged with `--limit`, `--offset`, `--all`) |
| `plivo voice calls get <call_uuid> [flags]` | Get a call by UUID. `--live` gets a call in progress, not its record. |
| `plivo voice calls hangup <call_uuid>` | Hang up a live call (requires --yes) |
| `plivo voice calls transfer <call_uuid> [flags]` | Transfer one or both legs of a live call to new PlivoXML URLs |
| `plivo voice calls play <call_uuid> [flags]` | Play audio file(s) into a live call |
| `plivo voice calls stop-play <call_uuid>` | Stop any audio playing in a live call |
| `plivo voice calls speak <call_uuid> [flags]` | Speak text into a live call via TTS |
| `plivo voice calls stop-speak <call_uuid>` | Stop any TTS playing in a live call |
| `plivo voice calls record <call_uuid> [flags]` | Start recording a live call |
| `plivo voice calls stop-record <call_uuid>` | Stop the active recording on a live call |
| `plivo voice calls dtmf <call_uuid> [flags]` | Send DTMF tones into a live call |

> [accordion] plivo voice calls make
>
> | Flag | Description |
> | - | - |
> | `--answer-method <value>` | GET\|POST (default: GET for the hello demo, else Plivo's POST) |
> | `--answer-url <value>` | URL returning PlivoXML to play on answer (default: Plivo's hello demo) (default "[https://s3.amazonaws.com/static.plivo.com/answer.xml](https://s3.amazonaws.com/static.plivo.com/answer.xml)") |
> | `--explain` | narrate in plain English before executing |
> | `--from <value>` | source number in international format, such as `+14155550100`; must be on your account (required) |
> | `--hangup-url <value>` | URL hit when call ends |
> | `--machine-detection <value>` | answering-machine detection: true\|hangup (off when omitted) |
> | `--ring-url <value>` | URL hit when call starts ringing |
> | `--to <value>` | destination: an international number with country code or a `sip:` URI; quote multiple destinations joined by `<` (required) |
>
> A `--from` that isn't an E.164 number, or a `--to` part that is neither an E.164 number nor a `sip:` URI, is refused before any request.

> [accordion] plivo voice calls list
>
> | Flag | Description |
> | - | - |
> | `--direction <value>` | inbound\|outbound |
> | `--from <value>` | filter by from\_number |
> | `--to <value>` | filter by to\_number |
> | `--live` | list the UUIDs of the calls in progress, not call records (takes no other list flag) |
> | `--since <value>` | calls ending at or after this UTC time (YYYY-MM-DD\[ HH:MM\[:SS]]), within the last 90 days, at most 31 days per request |
> | `--until <value>` | calls ending at or before this UTC time (YYYY-MM-DD\[ HH:MM\[:SS]]) |
> | `--from-date <value>` | same as --since |
> | `--to-date <value>` | same as --until |

> [accordion] plivo voice calls transfer
>
> | Flag | Description |
> | - | - |
> | `--aleg-method <value>` | GET\|POST (default "POST") |
> | `--aleg-url <value>` | new URL for A-leg (caller side) |
> | `--bleg-method <value>` | GET\|POST (default "POST") |
> | `--bleg-url <value>` | new URL for B-leg (callee side) |
> | `--legs <value>` | which leg(s) to act on: aleg\|bleg\|both (default "aleg") |

> [accordion] plivo voice calls play
>
> | Flag | Description |
> | - | - |
> | `--legs <value>` | aleg\|bleg\|both (default "aleg") |
> | `--length <integer>` | stop after N seconds (0 = full file) |
> | `--loop` | loop the playback |
> | `--mix` | mix with the call audio (else replace) (default true) |
> | `--urls <value>` | comma-separated list of audio file URLs to play (required) |

> [accordion] plivo voice calls speak
>
> | Flag | Description |
> | - | - |
> | `--language <value>` | language code, e.g. en-US, en-GB, hi-IN (default "en-US") |
> | `--legs <value>` | aleg\|bleg\|both (default "aleg") |
> | `--mix` | mix with the call audio (else replace) (default true) |
> | `--text <value>` | text to speak via TTS (required) |
> | `--voice <value>` | voice: MAN\|WOMAN (default "WOMAN") |

> [accordion] plivo voice calls record
>
> | Flag | Description |
> | - | - |
> | `--callback-method <value>` | GET\|POST (default "POST") |
> | `--callback-url <value>` | URL hit when recording finishes |
> | `--file-format <value>` | mp3\|wav (default "mp3") |
> | `--record-channel-type <value>` | mono\|stereo (stereo puts each leg on its own channel) |
> | `--time-limit <integer>` | max recording length in seconds (default 60) |
> | `--transcription-type <value>` | transcription type: auto\|hybrid\|manual (results go to --transcription-url) |
> | `--transcription-url <value>` | URL the transcription is sent to |

> [accordion] plivo voice calls dtmf
>
> | Flag | Description |
> | - | - |
> | `--digits <value>` | DTMF digits to send, e.g. 1234# (required) |
> | `--leg <value>` | aleg\|bleg (default "aleg") |

## Streams on a live call (REST)

Start a WebSocket audio stream on an already-answered call (instead of via `<Stream>` XML), list the streams on a call, or stop them.

| Usage | What it does |
| - | - |
| `plivo voice calls streams start <call_uuid> [flags]` | Start a new audio stream on a call |
| `plivo voice calls streams list <call_uuid>` | List active streams on a call |
| `plivo voice calls streams get <call_uuid> <stream_id>` | Get details for one stream on a call |
| `plivo voice calls streams stop <call_uuid> [stream_id]` | Stop one stream (with id) or all streams (without id) on a call |

> [accordion] plivo voice calls streams start
>
> | Flag | Description |
> | - | - |
> | `--audio-track <value>` | inbound\|outbound\|both (default "inbound") |
> | `--bidirectional` | let the WebSocket send audio back into the call (needs --audio-track inbound) |
> | `--callback-url <value>` | alias for --stream-status-callback |
> | `--content-type <value>` | audio codec content-type (default "audio/x-l16;rate=16000") |
> | `--extra-headers <value>` | comma-separated extra WebSocket headers (k1=v1,k2=v2) |
> | `--stream-status-callback <value>` | URL hit when stream starts/ends |
> | `--url <value>` | WebSocket URL to receive audio (wss\://...) (required) |
