Event field instead of Twilio’s separate callback URLs, and swapping Twilio’s X-Twilio-Signature (HMAC-SHA1) validator for Vobiz’s X-Vobiz-Signature-V3 (HMAC-SHA256 + nonce). This page maps every piece and shows before/after validation code.
AUTH_TOKEN is your Vobiz Auth Token (the api_key you pass to the SDK is your Auth ID → X-Auth-ID; the Auth Token → X-Auth-Token). The same Auth Token is the HMAC key that signs your inbound webhooks.Request parameter mapping
Twilio POSTsapplication/x-www-form-urlencoded params to your voice URL; Vobiz posts the same content type to your answer_url. The values you already read carry over under Vobiz names.
<Gather> action-URL parameters
Twilio’s <Gather> posts Digits and SpeechResult (plus Confidence) to its action URL. Vobiz’s <Gather> posts the same input under Vobiz names.
Twilio’s
<Gather timeout=…> becomes Vobiz’s executionTimeout; speechTimeout becomes speechEndTimeout; numDigits, finishOnKey, and hints keep their names. Full attribute list: Gather reference.Callback flow: separate URLs → one Event field
Twilio uses a primary voice URL plus a separate StatusCallback for lifecycle events. Vobiz delivers lifecycle transitions to your flow as an Event value, so you branch on one field.
Signature validation: X-Twilio-Signature → X-Vobiz-Signature-V3
Twilio signs with HMAC-SHA1 keyed by your Auth Token over the full URL (scheme, host, port, query) with every POST field appended in alphabetical order, base64-encoded, sent asX-Twilio-Signature. The RequestValidator helper reproduces the string and compares.
Vobiz signs with HMAC-SHA256 keyed by your Auth Token over baseURL + "." + nonce (query stripped), base64-encoded, sent as X-Vobiz-Signature-V3 with the random nonce in X-Vobiz-Signature-V3-Nonce.
Before / after - Flask (Python)
Before / after - Node
Handling the lifecycle event in one handler
Key differences
- One signature helper, HMAC-SHA256. Where Twilio’s
RequestValidatorrebuilds the full URL plus every sorted POST field, Vobiz signsbaseURL + "." + noncewith SHA-256 - a short, deterministic string that’s easy to reproduce in any language with the standard library (no param-sorting step). Validate values you read from the body in your handler, as you would on any platform. - A nonce per request. Vobiz adds
X-Vobiz-Signature-V3-Nonce, giving each signed request a fresh random component. Read it case-insensitively and feed it straight into the HMAC. - Events in the same handler. Instead of wiring a separate
StatusCallbackURL, branch on theEventfield (Ring,StartApp,Hangup) inside your existing endpoint - fewer URLs to register and secure. - Same parameter vocabulary.
CallStatusandDirectionuse the same words you already parse; mostly you renameCallSid → CallUUIDandSpeechResult → Speech. - Constant-time compares. Use
hmac.compare_digest(Python) orcrypto.timingSafeEqual(Node) - never==- exactly as Twilio’s helper does internally. - Sub-account safety built in. On sub-account callbacks Vobiz adds
X-Vobiz-Signature-MA-V3, signed with the parent-account token, so a parent can independently verify child traffic with the same validator.
Twilio migration overview
The at-a-glance matrix and recommended migration order.
Voice Call API mapping
REST calls: create, fetch, and control live calls on Vobiz.