Recordings

A recording is a WAV file captured by <Dial record="...">, <Record> or a recorded <Conference> in your markup. You can pause, resume or stop recording on a live call, and download a finished recording with your API key. Connect does not transcribe recordings.

API stabilityConnect is live. The API is v0.x, so field names may change before v1. Base URL: https://connect.telvox.dev/api.

How recordings are made

Recording is set in the markup your webhook returns. There is no REST call that starts a recording.

  • <Dial> records the conversation. Pick the mode with its record attribute (table below).
  • <Record> records the caller on their own, for voicemail. It takes maxLength (default 60 seconds), finishOnKey (default #), playBeep (default false) and an action URL, then carries on to the next verb.
  • <Conference> records the room with record="record-from-start".
  • A number can also have a recording policy set in the dashboard. A locked policy blocks pause and stop on that number's calls.
answer.xml
<Response>
  <Dial record="record-from-answer"
        recordingStatusCallback="https://your.app/voice/rec-status"
        recordingStatusCallbackEvent="in-progress completed absent">
    <Number>+919876500199</Number>
  </Dial>
</Response>
200 · application/xml
Dial recordTypeDescription
record-from-answerdefaultRecord the conversation from the moment the call is answered. This is what Dial does when you leave record out.
record-from-ringingmodeStart recording while the far end is still ringing.
record-from-answer-dualmodeTwo-channel recording, one party per channel. Needs a SIP trunk with dual-channel recording switched on; otherwise you get one mixed file and RecordingFallbackReason says why.
record-from-ringing-dualmodeAs above, starting from ringing.
do-not-recordmodeDo not record this Dial.

Pause, resume or stop

Control recording on a live call, for example to pause while a caller reads out a card number. Send a POST with no body. Nothing is written while recording is paused.

POST/api/calls/{callSid}/recording/pause

Pause recording on a live call.

POST/api/calls/{callSid}/recording/resume

Start recording again after a pause.

POST/api/calls/{callSid}/recording/stop

Stop recording for the rest of the call.

POST/api/calls/{callSid}/recording/pause
curl -X POST https://connect.telvox.dev/api/calls/CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5/recording/pause \
  -H "Authorization: Bearer $TELVOX_API_KEY" \
  -H "Accept: application/json"
200 okpaused
responses
{
  "ok": true,
  "call_sid": "CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5",
  "action": "pause",
  "status": "paused",
  "session_id": null
}
application/json
CodeMeaning
200 OKThe engine accepted the command. status is paused, recording (after resume) or stopped.
404 Not FoundThe call SID is not on your account.
409 ConflictPause and stop only. The number's recording policy is locked, so recording cannot be turned off. Resume is always allowed.
502 Bad GatewayThe call engine rejected the command. The body has error, engine_status and engine_body.
503 Service UnavailableRecording controls are switched off.

Download a recording

Use the recording's name: the RecordingName in the recording callback, the last part of its RecordingUrl, or the recording_url field on a fetched call. Names use letters, digits, -, _ and .. You can only fetch your own recordings.

GET/api/recordings/{recordingName}/info

Recording details as JSON, without downloading the audio.

PropertyTypeDescription
recording_namestringThe recording's name, as sent in RecordingName and at the end of RecordingUrl.
call_sidstringThe call this recording belongs to.
durationintegerLength in seconds, taken from the call record.
mime_typestringAlways "audio/wav".
download_urlstringWhere to GET the audio, with your API key.
200 response
{
  "recording_name": "cpaas-channel-CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5-1719912345678",
  "call_sid": "CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5",
  "duration": 47,
  "mime_type": "audio/wav",
  "download_url": "https://connect.telvox.dev/api/recordings/cpaas-channel-CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5-1719912345678"
}
200 ok
GET/api/recordings/{recordingName}

The audio as audio/wav. Add ?download=1 to receive it as an attachment instead of inline.

GET/api/recordings/{recordingName}
# metadata
curl https://connect.telvox.dev/api/recordings/$RECORDING_NAME/info \
  -H "Authorization: Bearer $TELVOX_API_KEY"

# audio (WAV); add ?download=1 to receive it as an attachment
curl -o call.wav https://connect.telvox.dev/api/recordings/$RECORDING_NAME \
  -H "Authorization: Bearer $TELVOX_API_KEY"
200 ok
200 response
HTTP/1.1 200 OK
Content-Type: audio/wav
Content-Disposition: inline; filename="cpaas-channel-CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5-1719912345678.wav"
X-CPaaS-Call-Sid: CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5
X-CPaaS-Recording-Duration: 47

<WAV bytes>
200 · audio/wav

Both endpoints return 404 with {"message": "Recording not found"} if the recording is not on your account, and the audio endpoint also returns 404 if the file is no longer on the server. Fetch works on the recording stored on the call record; if a call produced more than one file, a second name can return 404.

Recording status callbacks

Set recordingStatusCallback on <Dial>, <Conference> or <Record>. Connect sends JSON with a 5 second timeout. Callbacks are not retried and not signed, so put a long random token in the URL and check it. See webhooks & callbacks.

AttributeTypeDescription
recordingStatusCallbackstringThe URL Connect sends recording status callbacks to.
recordingStatusCallbackMethodenumPOST (default) or GET.
recordingStatusCallbackEventstringSpace-separated list of statuses to send: in-progress, completed, absent, failed. Default completed.

Status values

RecordingStatusTypeDescription
in-progressstatusRecording has started.
completedstatusThe WAV file is stored and can be downloaded.
absentstatusRecording was asked for but no file was made. The call itself may still have gone fine.
failedstatusThe recording could not be finished or stored.

Callback payload

POSTyour recordingStatusCallback
{
  "RecordingStatus": "completed",
  "RecordingSource": "bridge",
  "RecordingName": "cpaas-bridge-3f6b2c1e-8d4a-4e7b-9c2f-1a5d7e9b0c4d-1719912351234",
  "RecordingUrl": "https://connect.telvox.dev/api/recordings/cpaas-bridge-3f6b2c1e-8d4a-4e7b-9c2f-1a5d7e9b0c4d-1719912351234",
  "RecordingDuration": 47,
  "RecordingCompletedAt": "2026-06-22T17:05:01.000Z",
  "CallSid": "CA7Q2M9X4K1B8N3T6R0W5Y2Z9C1V4H7JL5"
}
reply 2xx within 5 scompleted
FieldTypeDescription
RecordingStatusenumin-progress, completed, absent or failed.
RecordingNamestringThe recording's name. Use it with the fetch endpoints above.
RecordingUrlstringhttps://connect.telvox.dev/api/recordings/{name}. GET it with your API key.
RecordingDurationintegerLength in seconds. On completed.
RecordingSourceenumbridge (a Dial or conference), channel (one leg, such as Record or a number's recording policy) or mixmonitor-dual (two-channel).
RecordingSessionIdstringIdentifies this recording session.
RecordingStartedAt, RecordingCompletedAtstringISO 8601 start and finish times.
RecordingRequestedMode, RecordingActualModestringThe record mode you asked for and the one Connect used.
RecordingRequestedTrack, RecordingActualTrackstringThe track you asked for (inbound, outbound or both) and the one recorded.
RecordingFallbackReasonstringSet when a requested mode or track could not be honoured, for example a -dual mode on a trunk without dual-channel recording.
RecordingChannelsinteger2 for a dual-channel recording.
CallSidstringThe call being recorded.
ConferenceSidstringThe conference room name, for conference recordings.
ErrorMessagestringWhy it went wrong. On absent or failed.

Fields with no value are left out. The name format depends on how the recording was made, so treat it as an opaque string.