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
| Domain | Twilio | Vobiz | Migration effort |
|---|---|---|---|
| Voice Call API | Client(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_calls | Medium |
| TwiML → VobizXML | TwiML <Response> with <Say>/<Play>/<Gather>/<Dial>/<Record>; served from url or inline twiml | VobizXML <Response> with <Speak>/<Play>/<Gather>/<Dial>/<Record> built by the bundled vobizxml builder; served from answer_url | Low |
| Phone numbers | AvailablePhoneNumbers search + IncomingPhoneNumbers provision/configure | phone_numbers over a pre-provisioned inventory; purchase_from_inventory, assign_number_to_trunk, assign_did_to_subaccount | High |
| SIP trunking | Elastic 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 origination | Medium |
| Conferences | <Conference> noun + Conference/Participant REST resources | Same <Conference> verb; member ops split across conference/conference_members/conference_recording | Low |
| Recordings | <Record> + record="record-from-answer"; Recordings list/fetch/delete | <Record> + record_calls (start_recording/stop_recording); recordings.list_recordings/get_recording/delete_recording | Low |
| Sub-accounts | Subaccounts 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 |
| Webhooks | X-Twilio-Signature (HMAC-SHA1 over full URL + alphabetically-sorted POST params); RequestValidator helper; params CallSid/From/To/CallStatus/Digits | Ring/answer flow to your answer_url; X-Vobiz-Signature header + SDK validator; Gather posts collected input to your action URL | Medium |
| SDKs | Helper libraries from package registries (twilio-python, twilio for Node, etc.); Client; resource-CRUD method names | Seven languages git-cloned from vobiz-ai/*; Vobiz/VobizClient header auth; verb-named methods; explicit auth_id; bundled vobizxml | Medium |
Twilio → Vobiz mapping
| Twilio concept | Vobiz equivalent |
|---|---|
| Account SID | api_key — your Vobiz Auth ID, sent as the X-Auth-ID header |
| Auth Token | auth_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-01 | https://api.vobiz.ai/api/v1 |
| Account scope implicit in the request path | Explicit 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 call | answer_url + answer_method (both explicit) |
TwiML <Response> document | VobizXML <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> / Queues | live_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 search | phone_numbers.list_inventory_numbers(auth_id, country=, search=) |
IncomingPhoneNumbers.create (buy) | phone_numbers.purchase_from_inventory(auth_id, e164=) |
| Number → TwiML app / trunk binding | phone_numbers.assign_number_to_trunk(auth_id, phone_number, trunk_group_id=) |
| Elastic SIP Trunk | trunks.create_trunk(auth_id, name=, trunk_type=, max_concurrent_calls=) |
| Credential List / IP ACL / Origination URI | credentials.* / 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 compliance | sub_account_kyc.* — India KYC (PAN/GST/CIN/DigiLocker/hosted sessions) |
Recordings resource | recordings.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 resources | conferences.* + conference.* / conference_members.* / conference_recording.* |
X-Twilio-Signature + RequestValidator | X-Vobiz-Signature + SDK validator |
Webhook params CallSid / From / To / Digits | Ring/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.
2. Outbound call + call instructions
client.calls.create(...) becomes client.calls.make_call(...): add an explicit auth_id, point url → answer_url, and make answer_method explicit. Your TwiML answer document becomes VobizXML — same <Response>, <Say> → <Speak>, <Gather> keeps numDigits/finishOnKey and gains inputType + executionTimeout.
Recommended migration order
Work outward from the two foundations above so every later step builds on working auth and a working answer flow.- Credentials and client — map Account SID/Auth Token →
api_key/auth_token, swap the base URL tohttps://api.vobiz.ai/api/v1, and add the explicitauth_id. See Voice Call API. - TwiML → VobizXML — port your answer documents:
<Say>→<Speak>, keep<Gather>(addinputType/executionTimeout),<Dial><Client>→<Dial><User>. See TwiML → VobizXML and/xml/gather. - Outbound calls and live control —
calls.create→calls.make_call, and move in-call actions toplay_audio/speak_text/dtmf/record_calls+live_calls. See Voice Call API. - Numbers and SIP trunking — search the inventory,
purchase_from_inventory, then wiretrunks/credentials/ip_access_control_list/origination_uri. See Phone numbers and SIP trunking. - Conferences and recordings — same
<Conference>/<Record>verbs; adopt theconference*andrecord_calls/recordingsnamespaces. See Conferences and Recordings. - Sub-accounts and KYC — recreate subaccounts with
sub_accounts, then layer onsub_account_kycfor India onboarding. See Sub-accounts. - Webhook validation — swap
X-Twilio-Signature/RequestValidatorforX-Vobiz-Signature+ the SDK validator, and readGatherinput from theactionURL. See Webhooks. - Reporting and SDK cleanup — repoint call-log queries to
cdr.list_cdrs/get_cdrand 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-IDandX-Auth-Tokenheaders (the SDK does this for you), instead of Twilio’s HTTP BasicAccount SID:Auth Token. - Explicit
auth_ideverywhere. 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 youranswer_url, with the HTTP method stated explicitly — the same webhook-driven model as TwiMLurl, made explicit.- Familiar XML, one rename. VobizXML keeps the
<Response>container and most verbs; the main change is<Say>→<Speak>.<Gather>keepsnumDigits/finishOnKeyand addsinputType,executionTimeout, anddigitEndTimeout(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, andrecord_callsas 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_uriandsub_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 thevobizxmlbuilder in the box, so your REST calls and your answer-document generation come from one package.