Skip to main content
Vobiz maps cleanly onto the Twilio model you already know: your Twilio Account SID + Auth Token become the Vobiz api_key (Auth ID) and auth_token (sent as X-Auth-ID and X-Auth-Token headers), TwiML answer documents become VobizXML with the same <Response> container and familiar verbs, and client.calls.create(...) becomes client.calls.make_call(...). Most of a migration is mechanical — swap the base URL to https://api.vobiz.ai/api/v1, pass an explicit auth_id, and rename a handful of methods. The matrix below maps each domain to its Vobiz home and rates the effort, then a recommended migration order tells you what to move first.

At-a-glance matrix

DomainTwilioVobizMigration effort
Voice Call APIClient(account_sid, auth_token); client.calls.create(to, from_, url, method); in-call control via client.calls(sid).update(...)Vobiz(api_key, auth_token); calls.make_call(auth_id, from_, to, answer_url, answer_method); in-call actions on play_audio/speak_text/dtmf/record_calls; in-progress on live_callsMedium
TwiML → VobizXMLTwiML <Response> with <Say>/<Play>/<Gather>/<Dial>/<Record>; served from url or inline twimlVobizXML <Response> with <Speak>/<Play>/<Gather>/<Dial>/<Record> built by the bundled vobizxml builder; served from answer_urlLow
Phone numbersAvailablePhoneNumbers search + IncomingPhoneNumbers provision/configurephone_numbers over a pre-provisioned inventory; purchase_from_inventory, assign_number_to_trunk, assign_did_to_subaccountHigh
SIP trunkingElastic SIP Trunking (Trunks, Credential Lists, IP ACLs, Origination URIs)First-class trunks/credentials/ip_access_control_list/origination_uri in every SDK; account-scoped auth; priority-weighted originationMedium
Conferences<Conference> noun + Conference/Participant REST resourcesSame <Conference> verb; member ops split across conference/conference_members/conference_recordingLow
Recordings<Record> + record="record-from-answer"; Recordings list/fetch/delete<Record> + record_calls (start_recording/stop_recording); recordings.list_recordings/get_recording/delete_recordingLow
Sub-accountsSubaccounts under the Accounts resource (create, suspend, close)sub_accounts CRUD plus kyc_mode/business_type and first-class India KYC via sub_account_kyc (PAN/GST/CIN/DigiLocker/hosted sessions)High
WebhooksX-Twilio-Signature (HMAC-SHA1 over full URL + alphabetically-sorted POST params); RequestValidator helper; params CallSid/From/To/CallStatus/DigitsRing/answer flow to your answer_url; X-Vobiz-Signature header + SDK validator; Gather posts collected input to your action URLMedium
SDKsHelper libraries from package registries (twilio-python, twilio for Node, etc.); Client; resource-CRUD method namesSeven languages git-cloned from vobiz-ai/*; Vobiz/VobizClient header auth; verb-named methods; explicit auth_id; bundled vobizxmlMedium

Twilio → Vobiz mapping

Twilio conceptVobiz equivalent
Account SIDapi_key — your Vobiz Auth ID, sent as the X-Auth-ID header
Auth Tokenauth_token, sent as the X-Auth-Token header
Client(account_sid, auth_token)Vobiz(api_key=AUTH_ID, auth_token=AUTH_TOKEN) (Python) · new VobizClient({ apiKey, authToken }) (Node)
API base https://api.twilio.com/2010-04-01https://api.vobiz.ai/api/v1
Account scope implicit in the request pathExplicit auth_id passed to every account-scoped method
client.calls.create(to, from_, url, method)client.calls.make_call(auth_id, from_, to, answer_url, answer_method)
url / inline twiml on the callanswer_url + answer_method (both explicit)
TwiML <Response> documentVobizXML <Response> built with vobizxml.ResponseElement()
<Say><Speak> · live: speak_text.call(auth_id, call_uuid, text=)
<Play><Play> · live: play_audio.call(auth_id, call_uuid, urls=)
<Gather input numDigits timeout finishOnKey><Gather inputType numDigits executionTimeout digitEndTimeout finishOnKey> (reference)
<Dial><Number> / <Dial><Client><Dial><Number> / <Dial><User>
<Record> / record="record-from-answer"<Record> · live: record_calls.start_recording / stop_recording
<Redirect> (continue at another TwiML URL)<Redirect> (continue at another VobizXML URL) — the way to move a call imperatively
<Hangup> / client.calls(sid).update(status='completed')<Hangup> · live_calls.hangup_call(auth_id, call_uuid)
<Enqueue> / Queueslive_calls.list_queued_calls / get_queued_call
client.calls(sid).update(...) (in-call redirect)live_calls.get_live_call(auth_id, call_uuid, status='live') + play_audio/speak_text/dtmf/record_calls
AvailablePhoneNumbers searchphone_numbers.list_inventory_numbers(auth_id, country=, search=)
IncomingPhoneNumbers.create (buy)phone_numbers.purchase_from_inventory(auth_id, e164=)
Number → TwiML app / trunk bindingphone_numbers.assign_number_to_trunk(auth_id, phone_number, trunk_group_id=)
Elastic SIP Trunktrunks.create_trunk(auth_id, name=, trunk_type=, max_concurrent_calls=)
Credential List / IP ACL / Origination URIcredentials.* / ip_access_control_list.create_ip_acl / origination_uri.create_origination_uri
Subaccounts (Accounts resource)sub_accounts.create_subaccount(auth_id, name=, email=, kyc_mode=, business_type=, enabled=)
Regulatory Bundles / number compliancesub_account_kyc.* — India KYC (PAN/GST/CIN/DigiLocker/hosted sessions)
Recordings resourcerecordings.list_recordings / get_recording / delete_recording(auth_id, ...)
Call logs (Calls list)cdr.list_cdrs(auth_id, from_number=, to_number=, start_date=, end_date=, ...) / get_cdr(auth_id, call_id)
Conference / Participant resourcesconferences.* + conference.* / conference_members.* / conference_recording.*
X-Twilio-Signature + RequestValidatorX-Vobiz-Signature + SDK validator
Webhook params CallSid / From / To / DigitsRing/answer-flow params posted to your answer_url / Gather action URL

Two changes that unlock everything

Before touching any domain, land these two orientation swaps — they cover the majority of a Twilio port.

1. Credentials and client

Same two secrets, moved into headers. Your Account SID is the Auth ID (api_key); your Auth Token is auth_token.
from twilio.rest import Client

client = Client(ACCOUNT_SID, AUTH_TOKEN)

2. Outbound call + call instructions

client.calls.create(...) becomes client.calls.make_call(...): add an explicit auth_id, point urlanswer_url, and make answer_method explicit. Your TwiML answer document becomes VobizXML — same <Response>, <Say><Speak>, <Gather> keeps numDigits/finishOnKey and gains inputType + executionTimeout.
call = client.calls.create(
    to='+14165553434',
    from_='+14155551234',
    url='https://example.com/answer.xml',
    method='POST',
)
Work outward from the two foundations above so every later step builds on working auth and a working answer flow.
  1. Credentials and client — map Account SID/Auth Token → api_key/auth_token, swap the base URL to https://api.vobiz.ai/api/v1, and add the explicit auth_id. See Voice Call API.
  2. TwiML → VobizXML — port your answer documents: <Say><Speak>, keep <Gather> (add inputType/executionTimeout), <Dial><Client><Dial><User>. See TwiML → VobizXML and /xml/gather.
  3. Outbound calls and live controlcalls.createcalls.make_call, and move in-call actions to play_audio/speak_text/dtmf/record_calls + live_calls. See Voice Call API.
  4. Numbers and SIP trunking — search the inventory, purchase_from_inventory, then wire trunks/credentials/ip_access_control_list/origination_uri. See Phone numbers and SIP trunking.
  5. Conferences and recordings — same <Conference>/<Record> verbs; adopt the conference* and record_calls/recordings namespaces. See Conferences and Recordings.
  6. Sub-accounts and KYC — recreate subaccounts with sub_accounts, then layer on sub_account_kyc for India onboarding. See Sub-accounts.
  7. Webhook validation — swap X-Twilio-Signature/RequestValidator for X-Vobiz-Signature + the SDK validator, and read Gather input from the action URL. See Webhooks.
  8. Reporting and SDK cleanup — repoint call-log queries to cdr.list_cdrs/get_cdr and finish adopting the git-cloned SDKs. See SDKs.

Key differences

  • Same two secrets, header auth. Vobiz sends your Auth ID and Auth Token as X-Auth-ID and X-Auth-Token headers (the SDK does this for you), instead of Twilio’s HTTP Basic Account SID:Auth Token.
  • Explicit auth_id everywhere. Every account-scoped Vobiz method names the account it acts on, so multi-tenant and sub-account code reads unambiguously and is easy to audit.
  • answer_url + answer_method. A Vobiz call fetches VobizXML from your answer_url, with the HTTP method stated explicitly — the same webhook-driven model as TwiML url, made explicit.
  • Familiar XML, one rename. VobizXML keeps the <Response> container and most verbs; the main change is <Say><Speak>. <Gather> keeps numDigits/finishOnKey and adds inputType, executionTimeout, and digitEndTimeout (per-leg answer timeouts live on <Dial>/<Number>).
  • Dedicated in-call resources. Where Twilio updates a call to redirect or act on it, Vobiz exposes live_calls, play_audio, speak_text, dtmf, and record_calls as first-class, strongly-typed resources keyed by (auth_id, call_uuid).
  • Imperative transfers via <Redirect>. To move a call to a new flow, return <Redirect> from the answer URL — a clean, stateless hand-off that keeps your call logic in one place.
  • SIP trunking and India KYC are first-class in the SDK. trunks/credentials/ip_access_control_list/origination_uri and sub_account_kyc (PAN/GST/CIN/DigiLocker/hosted sessions) are typed resources in all seven SDKs.
  • SDKs you git-clone. The seven Vobiz SDKs are cloned from vobiz-ai/* and ship the vobizxml builder in the box, so your REST calls and your answer-document generation come from one package.
Ready to go deeper? Start with the Voice Call API and TwiML → VobizXML pages.