Playback overview
Playback controls audio on one active session.
When to use
Use Playback when one participant should hear audio, whether it comes from a prerecorded file or a live stream.
Use Start audio playback, then choose the Audio files, Live TTS, or Silence tab. Pause, resume, restart, and stop work with every playback source. Seek is available only during file playback.
Every control command returns 202 Accepted when accepted for processing. Keep
the originating play command’s operation_uuid until playback.stopped or
playback.failed, and reuse it if you retry after losing the response. A later
stop command has its own acknowledgement UUID, while playback.stopped retains
the play command’s UUID.
Session playback controls one call leg. Use Room Playback to control the shared room mix.
Lifecycle events
Playback events track audio playback on active calls, including start, completion, and error states.
The correlation field on every webhook here is operation_uuid. Lifecycle
events normally echo the 202 Accepted response for the playback/play
command that owns that playback. A terminal event caused by a later
playback/stop retains the original start or silence operation UUID.
Every payload schema below also includes the required aud string, which
identifies the application that should receive the signed event.
playback.started
Fired when the playback application starts after it sets up the requested audio or silence source. This is a best-effort application-start signal, not confirmation that audio reached the remote caller.
Payload schema
Measuring application-start latency
The timestamp field lets you estimate application-start latency from the
request to event emission:
Record the time you issued the playback/play request, parse timestamp when
the playback.started webhook arrives, and subtract.
Cross-clock caveat — treat the result as approximate. The event timestamp and your POST-request time come from different clocks and can differ slightly. Use the computed latency for trend monitoring and relative comparisons, not as an exact, sub-millisecond measurement. A small negative value (e.g. the webhook timestamp appearing slightly before your send time) is possible under clock skew and should be treated as ~0.
playback.stopped
Fired when playback completes normally or is stopped via the playback/stop
command. The offset_ms field indicates where finite file playback ended.
Before it accepts a finite type: files request, the platform runs a
request-time probe that confirms each source can be fetched. A finite source
rejected by that probe emits no playback lifecycle event. Otherwise, the
outcomes are:
- Each accepted playback that starts emits exactly one
playback.stoppedevent on completion or interruption. - An accepted playback that cannot start emits
playback.failed. - A pushed live stream completes after the source closes normally and all accepted audio drains. It can also be replaced, stopped, or ended with the Session. Silence normally runs until one of those actions occurs.
Payload schema
playback.failed
Fired when an accepted playback command cannot be completed. The request-time
validation checks the request shape and URL policy before a finite
type: files request is accepted. The platform prepares the sources
asynchronously after acceptance. If a source cannot be prepared, or if an
accepted playback cannot start or complete, the platform emits
playback.failed. playback/restart also emits this event when no playback is
active. DTMF collection does not emit this event. Inspect the reason field to
determine why the operation failed.
Payload schema
Triggered by
These events are produced by the following commands:
playback.started— playback/play (Asynchronous).playback.stopped— playback/play (completion or interruption) and playback/stop.playback.failed— playback/play and playback/restart.
Playback pause, resume, seek, and restart admission is acknowledged only by each
request’s 202 Accepted response; no webhook reports admission.