Twilio migration
Bring a supported Twilio voice workload to Signals.
Signals mirrors the Twilio 2010-04-01 Calls API and OneML is derived from TwiML. Migration starts by checking your application against the public compatibility matrix.
Not full parity. Not a zero-code promise.
Same request shape, Signals hostname
curl -X POST "https://api.helios.pressone.co/2010-04-01/Accounts/ACCOUNT_SID/Calls.json" \
-u ACCOUNT_SID:AUTH_TOKEN \
-d "To=+2341800000001" \
-d "From=+2341700000000" \
-d "Url=https://example.com/voice"Placeholder credentials and numbers.
Migration process
Inventory, compare, test, then move traffic.
- 01Inventory the Calls API operations, TwiML verbs and attributes, callbacks and helper-library assumptions your application depends on.
- 02Compare every dependency with the public compatibility matrix.
- 03Update the base URL and credentials, and change behaviour that is not supported.
- 04Validate webhook signature verification and callback handling against Signals.
- 05Test a controlled Nigerian workload end to end.
- 06Expand traffic only after behaviour matches expectations.
What is familiar
Most of the request surface will look like your existing code.
The 2010-04-01 Calls resource
Call creation and inspection use the same resource shape your application already targets.
Form-encoded create-call requests
Requests use PascalCase fields such as To, From, Url and StatusCallback.
TwiML-shaped documents
OneML uses the same structure as TwiML for the verbs that are supported.
X-Twilio-Signature
The signature header name is retained for verification compatibility with existing middleware.
Standard webhook fields
CallSid, AccountSid, From, To, CallStatus, Direction and ApiVersion arrive as your handlers expect.
Helper libraries need checking
Some helper-library behaviour does not carry over unchanged. Verify each call path rather than assuming an SDK works end to end.
What requires review
Check these before you move any traffic.
Unsupported verbs and child targets
Some TwiML verbs, attributes and child elements are not implemented. The matrix lists what is skipped or rejected.
Dial to SIP is tenant-only
<Dial><Sip> is limited to registered extensions in the caller’s own tenant domain, rather than arbitrary SIP URIs.
Live call update encoding
Updating a call in progress requires JSON with snake_case fields, an exception to the form-encoded PascalCase pattern.
Non-uniform error responses
Some non-create operations return plain text or otherwise non-uniform errors, so error parsing needs review.
Recordings list is not paginated
Code that walks paginated recording lists needs adjusting.
Inbound calls emit no status callbacks
Status callbacks apply only to calls created through the REST API. Inbound calls use the configured voice URL.
Say behaviour and voices
Say behaviour and available voices are provider-specific, so prompts should be reviewed by ear.
Only Stream under Connect, Start and Stop
Within the supported Connect, Start and Stop patterns, Stream is the implemented child. Other nested products are not available.
Code path
Point an existing request at the Signals hostname.
Create a call on Signals
curl -X POST "https://api.helios.pressone.co/2010-04-01/Accounts/ACCOUNT_SID/Calls.json" \
-u ACCOUNT_SID:AUTH_TOKEN \
-d "To=+2341800000001" \
-d "From=+2341700000000" \
-d "Url=https://example.com/voice"The base hostname is api.helios.pressone.co and the resource path is the familiar 2010-04-01 Calls resource. Credentials are your Signals account SID and auth token.
The endpoint and credentials are the first change, not always the only one. Documents, callbacks and error handling still need to be checked against the matrix.
When not to migrate
Cases where staying put is the right decision.
A fuller side-by-side view of the trade-offs, including numbers, billing and support, is set out in the comparison.
Trademark notice
Twilio and TwiML are trademarks of Twilio Inc. or its affiliates. Signals is not affiliated with or endorsed by Twilio Inc.
Next step