Edesy is a Twilio alternative built for Indian voice apps: the call API, Basic auth and status callbacks follow Twilio's shape, billing is a prepaid INR wallet with GST invoices, and you buy Indian numbers self-serve after KYC. The one big difference: your answer URL returns VoiceML JSON, not TwiML. Plan for that rewrite and most of the rest carries over.
Try the Voice API: Open the Edesy voice portal. Buy a number after KYC and place your first call from the API console.
This post is for developers who already know Twilio and are building something that mostly calls or answers Indian numbers. It sets out what is the same, what is different, and when staying on Twilio is the better call.
What carries over from Twilio
| Twilio concept | Edesy equivalent | Notes |
|---|---|---|
POST /Accounts/{Sid}/Calls |
POST /v1/Accounts/:sid/Calls or POST /v1/calls |
Same handler behind both paths |
Basic auth AccountSid:AuthToken |
Supported | Or Authorization: Bearer <api key> |
StatusCallback |
status_callback |
Payload uses PascalCase: CallSid, CallStatus, Duration |
| Recordings under the account | /v1/Accounts/:sid/Recordings and /v1/recordings |
Encrypted cloud storage, signed links |
| Modify / end a live call | POST or DELETE /v1/calls/:sid |
Update or hang up mid-call |
MachineDetection |
not on single calls | Answering-machine detection is a campaign setting |
| ConversationRelay | Conversation Relay | Same protocol; a bot written for Twilio works unchanged |
| Media Streams | Media Streams | Different wire format (raw L16 PCM, not base64 mu-law) |
| TwiML | VoiceML (JSON) | Must be rewritten; see below |
Status callbacks also carry fields Twilio does not send by default: SipResponseCode, HangupReason and
CallOutcome. CallOutcome tells you whether the call ended at the person (busy, rejected, no answer), an
unreachable phone, an invalid number, the network, your account (for example, low balance) or the platform. That
makes retry logic simpler. See call status callbacks explained.
What is different
VoiceML, not TwiML. When a call connects, Edesy fetches your answer URL and expects JSON:
{
"instructions": [
{ "verb": "gather", "input": "dtmf", "num_digits": 1, "timeout": 5,
"action": "https://your-app.example.com/menu",
"nested": [
{ "verb": "say", "text": "Thanks for calling. Press 1 for sales, 2 for support." }
] },
{ "verb": "say", "text": "We did not get your choice. Goodbye." },
{ "verb": "hangup" }
]
}The verb set is: say, play, gather (keypad digits), record, dial, stream, redirect, reject, hangup and pause. If your TwiML uses those, the port is a mapping exercise. The migration guide has a verb-by-verb table.
JSON request bodies. Twilio's Calls API takes form-encoded parameters like Url and StatusCallback. Edesy
takes JSON with snake_case fields (url, status_callback, timeout, custom_parameters). The path and auth
can stay Twilio-shaped; the body changes.
More ways to start a call. Besides an answer URL, POST /v1/calls accepts plain text to speak, a WebSocket
stream_url for your own bot, inline VoiceML, or an application ID (a saved routing preset).
No server SDKs, no SMS API. You call REST over HTTPS. There are no Node or Python packages to install, and
there is no SMS product. For browser calling there is a JavaScript SDK (@edesy/voice-sdk), but that is a client
SDK, not a server one.
The India-specific parts
- Numbers: mobile, 92-series, landline and toll-free Indian numbers, searched and bought in the portal after KYC (PAN and Aadhaar; review takes about 24 hours). No setup fee.
- Billing: a prepaid INR wallet topped up with Razorpay, real-time deduction, GST invoices, and GSTIN capture so you can claim input tax credit. No dollar card, no FX line on your statement.
- Pulse: 60 seconds, with unanswered calls free.
- No minimum commitment.
| Item | Edesy price (excl. 18% GST) |
|---|---|
| Voice API call minutes | Rs 0.50/min, 60 s pulse, unanswered free |
| Mobile or 92-series number | Rs 499/month |
| Landline number | Rs 449/month |
| Toll-free number | Rs 999/month |
| Number setup | Rs 0 |
We don't quote Twilio's India rates here because they change; check Twilio's current pricing page, or see our Twilio voice pricing guide for context. Full Edesy rates are on Voice API pricing.
Bring your own AI stack
A lot of teams leaving Twilio are building AI voice agents. Edesy lets you point an Indian number at almost anything: a webhook that returns VoiceML, a SIP URI (LiveKit Cloud, Vapi, Retell, Bolna or your own), a raw-audio Media Stream, a text-in/text-out Conversation Relay bot, an IVR Studio flow, or a team's softphones. The full list of 11 inbound targets is on call routing.
When to stay on Twilio
Be honest with yourself about these:
- You need SMS, WhatsApp and voice from one API. Edesy has no SMS API.
- Most of your calls are outside India. Edesy is built around Indian numbers and INR billing.
- You rely on TwiML Studio flows or Twilio's server SDKs and can't budget time to rewrite answer handlers.
- You use Twilio products beyond voice (Verify, Conversations, Flex) that have no direct Edesy equivalent.
If voice to Indian numbers is the core of your product, the switch is usually worth testing. You can also do it gradually: Edesy's BYOC recipes let you bring a Twilio Elastic SIP trunk, Telnyx, Vonage or Plivo as a carrier.
How to evaluate it in an afternoon
- Sign up on the voice portal and complete KYC.
- Create an API key, or copy your Account SID and Auth Token.
- Place a test call with
textonly:{"from": "...", "to": "...", "text": "Hello from Edesy"}. - Point a
status_callbackat a request bin and look at the payload. - Port one TwiML answer handler to VoiceML and run it against a real number.
- Check the debugger, the per-call event timeline (
GET /v1/calls/:sid/events) and the webhook delivery log.
The Voice API docs cover authentication, the five ways to start a call, the VoiceML verb reference and webhooks. The Twilio alternative overview and the Voice API hub summarise the product.