Edesy is a voice API for India that keeps the Twilio developer experience: Twilio-shaped endpoints, Basic auth with your Account SID and Auth Token, and PascalCase status callbacks. You pay from a prepaid INR wallet with GST invoices, buy Indian numbers after KYC, and calls cost Rs 0.50/min on a 60-second pulse.
Rs 0.50
Per minute, 60 s pulse
Rs 0
Unanswered calls
Rs 499
Mobile number / month
INR
Wallet and GST invoices
Twilio-shaped API
ConversationRelay-compatible
INR wallet + GST invoices
No minimum commitment
| Edesy Voice API | |
|---|---|
| API base | https://voice-api.edesy.in/v1 |
| Auth | Authorization: Basic base64(AccountSid:AuthToken), or Authorization: Bearer sk_... |
| Place a call | POST /v1/calls (or the Twilio-shaped alias POST /v1/Accounts/{AccountSid}/Calls) |
| Answer URL returns | VoiceML (JSON), not TwiML |
| Status callback fields | PascalCase: CallSid, CallStatus, Duration, SipResponseCode, HangupReason, CallOutcome |
| AI bot protocols | ConversationRelay-compatible text WebSocket, raw-audio media streams, or SIP |
| Numbers | Indian mobile, landline, toll-free and 92-series, after KYC |
| Call rate | Rs 0.50/min, 60-second pulse, unanswered calls free |
| Number rental | Mobile or 92-series Rs 499/mo, landline Rs 449/mo, toll-free Rs 999/mo, Rs 0 setup |
| Billing | Prepaid INR wallet (Razorpay), GST invoices, GSTIN for Input Tax Credit |
| Commitment | None. Top up and pay as you go |
All prices exclude 18% GST.
An honest side-by-side. Twilio is a global platform with far more products; Edesy is a voice platform focused on Indian numbers and INR billing.
| Edesy | Twilio | |
|---|---|---|
| Billing currency | INR, prepaid wallet | USD |
| Call API shape | Twilio-shaped endpoints and Basic auth | Native |
| Answer instructions | VoiceML (JSON) | TwiML (XML) |
| Status callbacks | PascalCase fields, JSON body, HMAC-signed, retried | PascalCase fields, form-encoded |
| Text-in, text-out AI bots | ConversationRelay-compatible protocol | ConversationRelay |
| Raw audio to your bot | L16 PCM at 8 or 16 kHz, binary frames | Media Streams, base64 mu-law in JSON |
| Phone numbers | Indian numbers, self-serve after KYC | Many countries |
| SMS API | Not offered | Yes |
| Server helper libraries (Node, Python and so on) | Not offered: use plain HTTP | Yes |
What does not carry over: TwiML. If your answer URL returns TwiML, rewrite that handler to return VoiceML. Everything around it (the request shape, Basic auth, the status callback field names, your ConversationRelay bot) stays close to what you have.
The answer URL is fetched when the callee picks up. Twilio expects XML; Edesy expects a JSON list of instructions.
<!-- Twilio: TwiML -->
<Response>
<Say>Hi! This is a call from Acme.</Say>
<Play>https://cdn.example.com/promo.wav</Play>
<Hangup/>
</Response>
{
"instructions": [
{ "verb": "say", "text": "Hi! This is a call from Acme." },
{ "verb": "play", "url": "https://cdn.example.com/promo.wav" },
{ "verb": "hangup" }
]
}
VoiceML verbs: say, play, gather (keypad digits), record, dial, stream, redirect, reject, hangup and pause. See the VoiceML reference.
curl -X POST https://voice-api.edesy.in/v1/calls \
-u "$ACCOUNT_SID:$AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from": "+9180XXXXXXXX",
"to": "+9198XXXXXXXX",
"url": "https://myapp.example.com/answer",
"status_callback": "https://myapp.example.com/call-status"
}'
The request body is JSON. url is the answer URL, status_callback gets lifecycle events, and timeout (5 to 600 seconds), caller_name and custom_parameters work per call.
{
"CallSid": "CA...",
"AccountSid": "...",
"From": "+9180XXXXXXXX",
"To": "+9198XXXXXXXX",
"CallStatus": "no-answer",
"Direction": "outbound",
"Duration": 0,
"SipResponseCode": 480,
"HangupReason": "unavailable",
"CallOutcome": "unreachable",
"Timestamp": "2026-07-15T09:30:00Z"
}
HangupReason and CallOutcome go further than a bare failed: they tell a switched-off phone from an invalid number from a network problem. Callbacks are signed with X-Webhook-Signature: v1=<hex> over <X-Webhook-Timestamp>.<body>, retried with backoff, and listed in a delivery log. See status callbacks.
Most of the work is the answer URL. The rest is configuration.
Create a workspace on voice-app.edesy.in, then submit PAN and Aadhaar for your business type. Review takes about 24 hours.
Add money to the INR wallet with Razorpay and buy an Indian mobile, landline, toll-free or 92-series number.
Point your HTTP client at https://voice-api.edesy.in/v1 and use your Edesy Account SID and Auth Token for Basic auth, or an sk_ API key as a Bearer token.
Return a JSON instructions list from your answer URL. ConversationRelay bots and status-callback parsers usually need no change.
Use the API console and debugger to place test calls, read the per-call event timeline and check webhook deliveries before moving production numbers.
The parts of your integration that stay the same or close to it
Basic auth with AccountSid:AuthToken works on the Voice API, so curl -u and existing auth helpers keep working.
/v1/Accounts/{AccountSid}/Calls and /v1/Accounts/{AccountSid}/Recordings sit alongside the native /v1/calls and /v1/recordings.
CallSid, CallStatus, Duration and the rest, plus SipResponseCode, HangupReason and CallOutcome on the final event.
Edesy speaks Twilio's ConversationRelay protocol: setup, prompt, interrupt and dtmf in; text, play, sendDigits, language and end out.
Answering-machine detection runs on campaigns; single API calls do not apply it today.
Attach custom_parameters to a call and get them echoed back on your webhooks.
Five ways to drive a call from POST /v1/calls, and eleven inbound targets per number
Your server returns JSON instructions when the call is answered. The closest match to a TwiML app.
Your bot sends and receives text over a WebSocket. Edesy runs speech recognition, speech synthesis, barge-in and DTMF.
Raw L16 audio both ways over a WebSocket, for Pipecat or your own speech pipeline.
Send calls to LiveKit, Vapi, Retell, Bolna or any SIP endpoint on Indian numbers.
Termination trunks with IP or digest auth for your own PBX or voice platform.
Point each number at a webhook, SIP URI, stream, relay bot, IVR flow and more.
Explore more comparisons, alternatives, and resources
Tell us what your app does today and your monthly minutes. We'll map the TwiML to VoiceML with you.
Open the console, place a test call with your Account SID and Auth Token, and see the PascalCase callback arrive.