Skip to main content
If your Twilio app answers calls by returning TwiML, migrating to Vobiz is mostly a verb-for-verb rename. The document shape is identical: a root element wrapping ordered voice verbs. Twilio’s <Response> becomes Vobiz’s <Response>, <Say> becomes <Speak>, and the builder - twilio.twiml.voice_response.VoiceResponse() - becomes vobizxml.ResponseElement(). This page maps each voice verb and its attributes, then shows before/after IVRs you can copy.

The builder swap

Twilio’s helper libraries expose a VoiceResponse builder; Vobiz ships the equivalent ResponseElement in the bundled vobizxml module. Nesting, chaining, and serialization all mirror what you already do.

Verb-by-verb mapping

Vobiz also exposes add_dtmf (send digits) and add_preanswer (run verbs during early media) on the same ResponseElement, plus a first-class Gather with combined dtmf speech input.

Before / after: a DTMF IVR menu

A one-key menu. input/timeout/numDigits become inputType/executionTimeout/numDigits, and nested say becomes add_speak.
The XML Vobiz emits is verb-for-verb recognizable:

Before / after: forward a call with caller ID

Twilio’s <Dial> + <Number> maps straight to Vobiz’s <Dial> + <Number>; a <Client>/<Sip> target becomes <User>. callerId and timeout keep their names.
To reach a softphone or SIP endpoint (Twilio <Client>/<Sip>), nest a <User> instead of <Number>:
Vobiz · Python

Before / after: fork audio to a WebSocket

Twilio’s start().stream() (one-way) and connect().stream() (two-way) both map to Vobiz’s <Stream> - track becomes audioTrack, and bidirectional="true" requests two-way media.

Key differences

  • Same document, renamed verbs. The root stays <Response>; only leaf names change (SaySpeak, PauseWait, Client/SipUser). Nesting, ordering, and the “return XML from your answer URL” model are identical.
  • Gather gives you two silence timers. Twilio’s single timeout becomes Vobiz’s executionTimeout, and speechTimeout becomes speechEndTimeout. Vobiz adds a dedicated digitEndTimeout for inter-digit pacing, so DTMF and speech end conditions are tuned independently. Full attribute list on the Gather reference.
  • One Gather handles digits and speech together. Set inputType="dtmf speech" and whichever the caller does first is posted to your action URL - one verb for menus and open-ended intent capture.
  • User covers both Client and Sip. A single <User> element dials SIP endpoints and softphones, carries sendDigits for extensions, and sets custom X-VH- SIP headers via sipHeaders.
  • Conference is a top-level verb. Where Twilio nests <Conference> inside <Dial>, Vobiz returns <Conference> directly from <Response>; the room is created on first join and named by the element’s text content.
  • Transfers are declarative. Instead of an imperative “modify live call” step, return a <Redirect> (or new <Dial>) from your answer URL and Vobiz continues the call with the fresh XML - the same webhook-driven pattern your TwiML app already uses.
  • Streaming is built in. <Stream> forks audio over wss:// with audioTrack selection and bidirectional two-way media for AI voice-agent pipelines. See the Stream reference for codecs and reconnect options.