Twilio alternative for India

A Twilio Alternative Built for Calls in India

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 at a glance

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.

Edesy vs Twilio for calls in India

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.

TwiML to VoiceML: the one rewrite

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.

Place a call with your Account SID and Auth Token

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.

The status callback you already parse

{
  "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.

Move a Twilio voice app to Edesy

Most of the work is the answer URL. The rest is configuration.

  1. Step 1 of 5: Sign up and finish KYC

    Create a workspace on voice-app.edesy.in, then submit PAN and Aadhaar for your business type. Review takes about 24 hours.

  2. Step 2 of 5: Top up and buy a number

    Add money to the INR wallet with Razorpay and buy an Indian mobile, landline, toll-free or 92-series number.

  3. Step 3 of 5: Swap the credentials and base URL

    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.

  4. Step 4 of 5: Rewrite TwiML handlers as VoiceML

    Return a JSON instructions list from your answer URL. ConversationRelay bots and status-callback parsers usually need no change.

  5. Step 5 of 5: Test, then switch traffic

    Use the API console and debugger to place test calls, read the per-call event timeline and check webhook deliveries before moving production numbers.

What carries over from Twilio

The parts of your integration that stay the same or close to it

Account SID and Auth Token

Basic auth with AccountSid:AuthToken works on the Voice API, so curl -u and existing auth helpers keep working.

Twilio-shaped paths

/v1/Accounts/{AccountSid}/Calls and /v1/Accounts/{AccountSid}/Recordings sit alongside the native /v1/calls and /v1/recordings.

PascalCase status callbacks

CallSid, CallStatus, Duration and the rest, plus SipResponseCode, HangupReason and CallOutcome on the final event.

ConversationRelay bots

Edesy speaks Twilio's ConversationRelay protocol: setup, prompt, interrupt and dtmf in; text, play, sendDigits, language and end out.

Answering machine detection

Answering-machine detection runs on campaigns; single API calls do not apply it today.

Custom parameters

Attach custom_parameters to a call and get them echoed back on your webhooks.

Pick how your app controls the call

Five ways to drive a call from POST /v1/calls, and eleven inbound targets per number

Twilio alternative for India: FAQ

Moving voice traffic from Twilio?

Tell us what your app does today and your monthly minutes. We'll map the TwiML to VoiceML with you.

Keep your Twilio-style code. Pay in rupees.

Open the console, place a test call with your Account SID and Auth Token, and see the PascalCase callback arrive.