Migration
Your Twilio code already works here
Tayapro answers the Twilio request shape on the same paths, so a switch is a base URL and a key — not a rewrite. Traffic then runs through Tayapro routing and your own carrier accounts.
# Existing Twilio call, repointed at Tayapro curl -X POST \ https://api.your-domain.com/api/public/2010-04-01/Accounts/AC_ignored/Messages.json \ -u "AC_ignored:tk_live_your_key" \ --data-urlencode "To=+12025550123" \ --data-urlencode "From=+12025550111" \ --data-urlencode "Body=Your appointment is confirmed."
# The native Tayapro API
curl -X POST https://api.your-domain.com/api/public/v1/messages \
-H "Authorization: Bearer tk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"to":"+12025550123","body":"Your appointment is confirmed."}'Reference
Endpoint mapping
| Twilio | Tayapro | Notes |
|---|---|---|
| POST /2010-04-01/Accounts/{Sid}/Messages.json | POST /v1/messages | Both live. Form params To/From/Body, or JSON to/from/body. |
| GET /2010-04-01/Accounts/{Sid}/Messages.json | GET /v1/messages | Returns { messages: [...] } in compatibility mode. |
| POST /2010-04-01/Accounts/{Sid}/Calls.json | POST /v1/calls | Url becomes your answer URL; TwiML is replaced by call-flow steps. |
| GET /2010-04-01/Accounts/{Sid}/Calls.json | GET /v1/calls | Returns { calls: [...] } in compatibility mode. |
| IncomingPhoneNumbers.json | GET/POST /v1/numbers | Search with ?available=true, then buy and wire webhooks in one call. |
| Verify v2 Services / Verifications | POST /v1/verify, POST /v1/verify/check | Hashed codes, expiry, velocity and fraud checks built in. |
| X-Twilio-Signature | x-tayapro-signature: t=…,v1=… | HMAC-SHA256 over `t.body`, with replay protection. |
| Message status callbacks | Signed webhook events (message.sent, call.completed) | Configure endpoints in the console; retries and replay included. |
Fields
What each Twilio field becomes
| AccountSid | Ignored in compat mode — the API key identifies you |
| AuthToken | Your Tayapro API key (tk_live_…) in the password slot |
| MessageSid (SMxxx) | SM… in compat mode, msg_… on /v1 |
| CallSid (CAxxx) | CA… in compat mode, call_… on /v1 |
| TwiML | Provider-neutral call-flow steps (say, gather, dial, record) |
Guide
Five steps to switch
- 01
Create a Tayapro API key
In the console, open Team & API keys and create a live key with messages:send, calls:write, numbers:write and logs:read.
- 02
Bring your numbers across
Open Move from Twilio, paste your Twilio Account SID and auth token, review what would move, then import. Your Twilio account is left untouched.
- 03
Repoint your code
Change the base URL to https://api.your-domain.com/api/public and use your Tayapro key where the Twilio auth token used to go. Everything else stays as it is.
- 04
Switch webhook verification
Replace X-Twilio-Signature checks with x-tayapro-signature (HMAC-SHA256 of `${timestamp}.${rawBody}` using your endpoint secret).
- 05
Move to the native API when ready
The /v1 endpoints give you routing metadata, idempotency keys and one shape across text, voice, WhatsApp, RCS and email.
// Node: keep your Twilio-shaped requests, change host + credentials
const base = "https://api.your-domain.com/api/public";
const auth = Buffer.from("AC_ignored:tk_live_your_key").toString("base64");
await fetch(base + "/2010-04-01/Accounts/AC_ignored/Messages.json", {
method: "POST",
headers: {
Authorization: "Basic " + auth,
"Content-Type": "application/x-www-form-urlencoded",
},
body: new URLSearchParams({
To: "+12025550123",
From: "+12025550111",
Body: "Your appointment is confirmed.",
}),
});Ready to move your numbers? Open Move from Twilio or read the native API reference.