Record XML verb, same Record/ and Recording/ REST endpoints, and webhook-delivered transcription. Migration is mostly a base-URL (https://api.vobiz.ai/api/v1), auth-header (X-Auth-ID + X-Auth-Token, not Basic auth), and SDK-namespace swap.
Plivo → Vobiz mapping
| Plivo | Vobiz |
|---|---|
Record XML element | <Record> XML element (VobizXML) |
<Record> attrs action, method, fileFormat, maxLength, timeout, playBeep, finishOnKey, redirect | Same attribute names and semantics |
<Record recordSession="true"> | <Record recordSession="true"> |
<Record startOnDialAnswer="true"> (nested in Dial) | <Record startOnDialAnswer="true"> |
<Record transcriptionType="auto|hybrid">, transcriptionUrl, transcriptionMethod | Same attributes, values auto / hybrid |
<Record recordChannelType="mono|stereo"> | record_channel_type on the REST Record/ call (mono/stereo); not a Record-XML attribute |
POST /v1/Account/{id}/Call/{call_uuid}/Record/ (start) | POST /api/v1/Account/{auth_id}/Call/{call_uuid}/Record/ |
DELETE /v1/Account/{id}/Call/{call_uuid}/Record/ (stop) | DELETE /api/v1/Account/{auth_id}/Call/{call_uuid}/Record/ |
POST /v1/Account/{id}/Conference/{name}/Record/ | POST /api/v1/Account/{auth_id}/Conference/{name}/Record/ |
DELETE /v1/Account/{id}/Conference/{name}/Record/ | DELETE /api/v1/Account/{auth_id}/Conference/{name}/Record/ |
GET /v1/Account/{id}/Recording/ (list all) | GET /api/v1/Account/{auth_id}/Recording/ |
GET /v1/Account/{id}/Recording/{recording_id}/ | GET /api/v1/Account/{auth_id}/Recording/{recording_id}/ |
DELETE /v1/Account/{id}/Recording/{recording_id}/ | DELETE /api/v1/Account/{auth_id}/Recording/{recording_id}/ |
Python client.calls.record(...) / start_recording(...) | client.record_calls.start_recording(...) |
Python client.calls.stop_recording(call_uuid) | client.record_calls.stop_recording(...) |
Python client.conferences.record(...) | client.conference_recording.start_conference_recording(...) |
Python client.recordings.list() | client.recordings.list_recordings(...) |
Python client.recordings.get(recording_id) | client.recordings.get_recording(...) |
Python client.recordings.delete(recording_id) | client.recordings.delete_recording(...) |
Node client.calls.record(callUuid) | client.recordCalls.startRecording(...) |
Node client.recordings.list/get/delete | client.recordings.listRecordings/getRecording/deleteRecording |
Before / after — record a voicemail in XML
Plivo (PlivoXML) and Vobiz (VobizXML) share the verb and attribute names verbatim:Plivo
Vobiz
RecordUrl, RecordingID, RecordingDuration, RecordingDurationMs, RecordingStartMs, RecordingEndMs. Vobiz adds RecordingEndReason (RecordingTimeout / maxLength / FinishedOnKey / HungUp).
Key differences & gotchas
- Recording namespace split. Plivo puts in-call recording on
client.calls; Vobiz splits it intoclient.record_calls(live call) andclient.conference_recording(conference). Stored-asset list/get/delete lives onclient.recordingson both sides. recordChannelTypelocation. On Vobiz, mono/stereo is set viarecord_channel_typeon the RESTRecord/call, not on the<Record>verb.- Transcription delivery. Both support
autoandhybrid. Vobiz posts the result totranscriptionUrl(XML) or the recordingcallback_url(REST) — there is no polling endpoint, so wire up the webhook. timeoutdefault differs.timeoutis the trailing-silence cutoff (Vobiz default 60s, Plivo default 15s); re-check your Plivo values after migrating.
What has no Vobiz equivalent
transcriptionType="manual"andtranscriptionReportType(full/compact). Vobiz transcription is machine ASR only (auto/hybrid) — no human/manual tier and no report-type toggle.- Rich recording-list filters. Plivo’s
recordings.list()filters bycall_uuid,from_number,to_number,conference_name, MPC details, andadd_time. Vobiz’sGET /Recording/pages withlimit/offsetonly — filter client-side. - Standalone Transcription resource. Plivo exposes a separate Transcription GET/DELETE API; Vobiz returns transcription only via the webhook payload, with no independently addressable record.
- MPC participant-level pause/resume recording. Vobiz recording is start/stop at the call or conference level — no per-participant pause.