Compatibility

Know exactly which call features are supported before migration.

Every verb, attribute, REST resource, and caveat is published with a clear support status — supported, partial, roadmap, or unsupported — so you can see exactly what migrates cleanly before you cut traffic over.

View matrix Validate VoiceML Migration guide

Voice markup compatibility matrix

Legend: ✓ Supported ◐ Partial ✗ Unsupported N/A Out of scope

Resource Endpoints VoiceTel Notes
Calls POST /Calls Normalises To/From against per-tenant phone regions; MachineDetection truly optional (matches Twilio — omit it and no AMD runs); Twiml/ApplicationSid accepted; per-call SIP/auth params (SendDigits, SipAuthUsername/SipAuthPassword, Timeout, CallReason) wired through to the originate.
GET /Calls/{Sid}
GET /Calls (filters: To, From, Status, ParentCallSid, StartTime≥/≤, EndTime≥/≤, Page, PageSize≤1000) Full Twilio query surface; EndTime auto-restricts to terminal-status rows.
POST /Calls/{Sid} (Status / Twiml / Url / FallbackUrl / StatusCallback*) Full Call resource on success; Twiml wins over Url; StatusCallback* swaps the live lifecycle-webhook wiring.
DELETE /Calls/{Sid}
Calls / Recordings GET /Calls/{Sid}/Recordings
GET /Calls/{Sid}/Recordings/{Sid}
POST /Calls/{Sid}/Recordings (start mid-call) Honours RecordingMaxDuration / PlayBeep / RecordingStatusCallback*.
POST /Calls/{Sid}/Recordings/{Sid} (Status=stopped/paused/in-progress) Stop, pause, resume; idempotent against already-completed.
DELETE /Calls/{Sid}/Recordings/{Sid} Unlinks WAV and drops row.
Calls / Streams GET /Calls/{Sid}/Streams[/{Sid}] Live tracker; list returns 0 or 1 (one fork per call).
POST /Calls/{Sid}/Streams (start) Mirrors <Connect><Stream> / <Start><Stream>; returns MZ-prefixed SID.
POST /Calls/{Sid}/Streams/{Sid} (Status=stopped)
Calls / Siprec GET /Calls/{Sid}/Siprec[/{Sid}] Live tracker.
POST /Calls/{Sid}/Siprec (start) Mirrors <Start><Siprec>; returns SR-prefixed SID.
POST /Calls/{Sid}/Siprec/{Sid} (Status=stopped) Clears tracking; underlying SIPREC module has no stop verb (recording continues until call hangup).
Calls / Transcriptions GET /Calls/{Sid}/Transcriptions[/{Sid}] Live tracker.
POST /Calls/{Sid}/Transcriptions (start) Mirrors <Start><Transcription>; returns RT-prefixed SID.
POST /Calls/{Sid}/Transcriptions/{Sid} (Status=stopped)
Calls / Payments POST /Calls/{Sid}/Payments[/{Sid}] <Pay> not implemented (PCI-DSS scope); path returns 404 — half-implementing PCI is more dangerous than a clean 404.
Calls / Events GET /Calls/{Sid}/Events Compatibility stub: 200 + empty list. Equivalent data delivered via the customer's StatusCallback URL — empty-list shape keeps SDK iterators clean.
Calls / Notifications GET /Calls/{Sid}/Notifications Compatibility stub: 200 + empty list. Operator-side events flow through Prometheus and structured logs.
Calls / UserDefinedMessages POST /Calls/{Sid}/UserDefinedMessages Returns 501 + Twilio error code 20501 (chat-style live-call messaging needs websocket message-passing infrastructure that's out of scope).
Conferences GET /Conferences Live conference query, multi-tenant namespaced.
GET /Conferences/{Sid}
POST /Conferences/{Sid} (Status=completed to end)
Conferences / Participants GET /Conferences/{Sid}/Participants[/{Sid}]
POST /Conferences/{Sid}/Participants/{Sid} (Muted, Hold) Mute/unmute and hold/unhold both wired.
DELETE /Conferences/{Sid}/Participants/{Sid} (kick)
Conferences / Recordings GET /Conferences/{Sid}/Recordings Metadata persisted at conference start; pagination envelope same as /Recordings.
Queues POST /Queues, GET /Queues[/{Sid}], POST /Queues/{Sid}, DELETE /Queues/{Sid} Full CRUD; in-process state.
Queues / Members GET /Queues/{Sid}/Members[/{Sid}|Front], POST /Queues/{Sid}/Members/{Sid|Front} VoiceTel extension — REST dequeue alongside <Dial><Queue> markup.
Applications POST /Applications, GET /Applications[/{Sid}], POST /Applications/{Sid}, DELETE /Applications/{Sid} Voice-only fields (no SMS).
Recordings (top-level) GET /Recordings[/{Sid}]
DELETE /Recordings/{Sid} Row + local WAV + S3 object (best-effort).
GET /Recordings/{Sid}.wav Binary audio/wav with three-state delivery: 200 (local), 302 to presigned S3 URL (archived), 410 Gone (cleaned up). All HTTP clients follow the 302 transparently.
IncomingPhoneNumbers GET /IncomingPhoneNumbers Tenant-scoped list of DIDs assigned to the authenticated account.
POST /IncomingPhoneNumbers Self-serve DID assignment by E.164. Idempotent on the same tenant; 409 if the number is claimed by another account. Inventory itself is provisioned via the VoiceTel Numbers workflow.
GET /IncomingPhoneNumbers/{Sid} Cross-tenant fetches 404 with the same shape as a nonexistent number — no enumeration leak.
POST /IncomingPhoneNumbers/{Sid} Only-set-fields-touched update semantics for voice routing on an assigned DID.
DELETE /IncomingPhoneNumbers/{Sid} Idempotent release: 204 on success or if the number was already gone.
AvailablePhoneNumbers GET /AvailablePhoneNumbers/{Country}/Local etc.
OutgoingCallerIds full sub-resource
ShortCodes full sub-resource
Sip / Domains
CredentialLists
IpAccessControlLists
full sub-resource SIP-domain provisioning handled by the SIP trunking workflow.
Messages
MMS
POST /Messages etc. N/A Compatibility surface is voice-only. See VoiceTel Messaging for the native messaging product.
Pricing API full N/A VoiceTel publishes rates directly; no Twilio-shaped pricing API.
Insights full N/A Twilio-hosted analytics product.
Verify
Lookup
Studio
TaskRouter
Conversations
Chat
Video
Proxy
Functions/Assets
Wireless
Trunking
Authy
full N/A Distinct Twilio products, out of scope for the compatibility surface.