Unified JSON-RPC style endpoint for executing call methods through command-based dispatch.
Send a request with the appropriate command field to invoke the desired call operation.
All async-safe RELAY methods can be sent through this endpoint without a WebSocket connection.
Use one of the following commands in the command field of the request body to perform the corresponding action on an active call.
For more details on each command, refer to the individual API reference documentation linked below.
The API token used to authenticate must have the following scope(s) enabled to make a successful request: Voice.
Update a call in progress — cancel, complete, or redirect the SWML flow.
State-transition rules:
status: canceled is only valid while the leg is queued or ringing.status: completed is only valid while the leg is answered (or in-progress).url or swml (redirect) is only valid while the leg is answered.busy, failed, no-answer, canceled, completed) cannot be updated.Play media (audio files, text-to-speech, silence, or ringtones) on an active call.
The HTTP response confirms the command was accepted. Playback lifecycle
is delivered asynchronously via the status_url webhook, with payloads
of the form {control_id, call_id, node_id, state} where state is one
of playing, paused, finished, or error.
Starts recording an active call. The HTTP response returns the call leg — the recording URL
is not included. Recording runs asynchronously; provide status_url to receive a webhook when
the recording finishes (with the final URL), or query the call’s events endpoint.
Collect user input (DTMF digits, speech, or both) on an active call.
At least one of digits or speech must be provided; requests missing
both return 400. Results are delivered asynchronously via the status_url
webhook. Digit events have the shape {control_id, call_id, node_id, result: {type:"digit", params: {digits, terminator}}}
and speech events {..., result: {type:"speech", params: {text, confidence}}}.
When start_input_timers is false, the initial_timeout clock does not
start until you send calling.collect.start_input_timers for the same
control_id.
Start detection (answering machine, fax tone, or DTMF digits) on an active call.
Detection runs asynchronously up to timeout seconds. Results are delivered
via the status_url webhook.
Capture audio from an active call and stream it to an external destination.
Audio is streamed via RTP (to a public IP/port) or WebSocket (to a ws:///wss:// URI).
Stop the tap with calling.tap.stop using the same control_id.
Transcribe the entire call in the background.
The transcription covers the whole call and completes when the call ends. For real-time
transcription, use calling.live_transcribe. Only one transcription can be active on a call
at a time; starting another while one is running returns a 409 conflict. Stop it with
calling.transcribe.stop using the same control_id.
Stream call audio to an external WebSocket endpoint.
Audio is sent to a wss:// URL; custom_parameters pass through to the
endpoint as connection metadata. Stream lifecycle webhooks are delivered to
status_url (default method POST). Stop the stream with
calling.stream.stop using the same control_id.
Enable noise reduction on an active call. Denoise is per-call (no
control_id); a call has at most one active denoise filter. Use
calling.denoise.stop to disable it.
Returned when the call is a Fabric subscriber device leg. The status field is always null for this type.
SignalWire Basic Authentication using Project ID and API Token.
The client sends HTTP requests with the Authorization header containing the word Basic followed by a space and a base64-encoded string of project_id:token. The project ID will be used as the username and the API token as the password.
Example: