Exotel Setup
Looking for the technical reference instead? See the Exotel Integration page for WebSocket message formats, audio specifications, and API details. This page is the customer setup guide.
This guide walks you through connecting an Exotel phone number to Edesy so your AI voice agent can answer inbound calls and make outbound calls — end-to-end, with screenshots, in about 15 minutes of clicking. The only step that's not under your control is asking Exotel support to enable the Voicebot Applet on your account, which typically takes one business day.
Exotel is a great fit when:
- You need an Indian virtual number (Exotel's coverage and TRAI / NDNC compliance are best-in-class for India)
- You already have an Exotel account and want to plug it into Edesy without changing providers
- You want a single-vendor billing relationship (Exotel handles voice minutes; Edesy handles AI usage)
If you don't yet have an Exotel account, sign up at my.exotel.com and provision a Direct Inward Dial (DID) before you start.
Prerequisites
Before you begin, make sure you have:
- Admin access to your Exotel dashboard at my.exotel.com
- Admin access to your Edesy workspace with at least one voice agent configured. If you haven't built an agent yet, see Creating an Agent
- An Exotel DID (virtual number) provisioned on your account
- Sufficient prepaid balance on your Exotel wallet (Exotel is prepaid; calls stop when the wallet hits zero)
Plan around the wait. Step 3 below requires Exotel support to enable the Voicebot Applet — that's a manual flag on their side and typically takes one business day. Steps 1, 2, and 4 can all be done in parallel while you wait — only Step 5 (assigning the App to your DID) is gated on the Voicebot Applet being live.
Step 1: Find your Exotel credentials
Log in to my.exotel.com, click your profile icon (top-right), and open API Settings. You'll find four values you need to copy.

| Field | Where to find it | Notes |
|---|---|---|
| Account SID | API Settings → top of the page | Numeric or alphanumeric identifier |
| API Key | API Settings → API Credentials section | Visible by default |
| API Token | API Settings → API Credentials section | Click Show to reveal — treat as a password |
| Subdomain | API Settings → next to your Account SID | Varies by region — see the table below |
Exotel routes API traffic by subdomain, and the subdomain depends on which region your account is in:
| Account region | Subdomain | Notes |
|---|---|---|
| Mumbai (India) | api.in.exotel.com |
Edesy default — leave the Subdomain field blank if you're on Mumbai |
| Singapore | api.exotel.com |
Override the default by entering this value |
| US | api.us.exotel.com |
Override the default by entering this value |
Important — copy the subdomain Exotel shows you exactly. Using the wrong subdomain causes outbound calls to fail with confusing 401 / 404 errors. Edesy's default is
api.in.exotel.com(Mumbai) since most of our customers are India-based. If your Exotel account is in Singapore or US, enter the matching subdomain in the credential form's Subdomain field.
Step 2: Add Exotel to Edesy
In your Edesy dashboard, go to Phone Numbers and click Add Phone. Select Exotel as the provider and fill in the form with the values you copied in Step 1.

| Field | Value |
|---|---|
| SID | Your Exotel Account SID |
| API Key | Your Exotel API Key |
| API Token | Your Exotel API Token (stored encrypted) |
| Phone Number | Your DID in E.164 format — for example +917314591974 |
| Subdomain (optional) | Leave blank if you're on Mumbai (api.in.exotel.com — Edesy default). Set to api.exotel.com for Singapore or api.us.exotel.com for US |
| App ID (see Step 4) | The numeric Custom App ID from App Bazaar (e.g., 42231). Required for outbound calls. Without it, outbound calls return a SID but never bridge audio — Exotel falls through to the DID's auto-provisioned empty App and the call times out as no-answer after ~34 seconds. Create the App in Step 4 first, copy the App ID, then return to this form. |
You must complete Step 4 before this credential is usable for outbound. Save the credential without an App ID first if you only want inbound for now — outbound will fail until you fill it in. Inbound works without an App ID only if you have an existing Custom App on your DID; for a fresh DID, you need Step 4 either way.
Click Save. Edesy validates the credentials against Exotel's API before saving — if validation fails, you'll see an inline error. The most common cause is a Subdomain mismatch (Step 1) or a typo in the API Token.
Tip — what happens after Save? Edesy shows a "Next steps" panel pointing at the three remaining actions: link an agent, configure the webhook on Exotel, and run a test call. The same actions are also accessible from the Phone Numbers list afterwards.
Step 3: Enable the Voicebot Applet on your Exotel account
The Voicebot Applet is what allows Exotel to stream live call audio to Edesy over a WebSocket. It's the core of the integration — but it's not enabled by default on every Exotel account.
To request enablement:
-
Email Exotel support at
[email protected] -
Use this template:
Subject: Enable Voicebot Applet on account [Your Account SID]
Hello team, please enable the Voicebot Applet on our account for voice streaming. We're integrating with an AI voice agent platform via WebSocket. Account SID: [Your Account SID].
-
Exotel typically enables it within one business day and replies on the same email thread
Already enabled? You can check by going to App Bazaar → Create Custom App and looking for a Voicebot component in the applets sidebar. If it's there, skip the support request and continue to Step 4.
While you wait for Exotel support, you can already complete Step 4 (creating the Custom App) — it just won't accept a Voicebot Applet until the flag is on.
Step 4: Create a Custom App with the Voicebot Applet
In the Exotel dashboard, go to App Bazaar → Create Custom App and give it a recognisable name (e.g., "Edesy Voice Agent"). Drag the Voicebot applet onto the call flow and configure it.

| Field | Value |
|---|---|
| URL | wss://voice-agent.edesy.in/ws/exotel?workspace_id=<WORKSPACE_ID> |
| Sample Rate | Leave at default (8 kHz). Edesy auto-upsamples 8 kHz → 16 kHz internally — no need to set 16 kHz here. |
| Custom Parameters | Leave blank. Per-call data flows via Edesy's API-level CustomField, not the Applet's static parameters. |
| Record | Enable if you want call recordings stored on your Exotel account |
Substitute <WORKSPACE_ID> with your Edesy workspace ID. See Finding Your Workspace ID, or copy it from the Workspace ID badge at the top of the Phone Numbers page.
Example after substitution:
wss://voice-agent.edesy.in/ws/exotel?workspace_id=cm12abcd0001
One App, all agents. The URL contains only
workspace_id— noagent_id. This single Voicebot Applet handles every agent in your workspace because Edesy passes the per-call agent ID via Exotel'sCustomFieldparameter. For inbound calls (no per-call data), Edesy auto-routes to whichever agent you assigned to the DID in Phone Numbers → your DID → Configure inbound webhook. You do not need a separate App per agent.
Important — the URL must start with
wss://, nothttps://. The Voicebot Applet expects a WebSocket URL directly. Pasting anhttps://URL is a common mistake and produces "application error" on inbound calls.
(Recommended) Drag a Hangup applet at the end of the flow so calls terminate cleanly:
Call Start → [Voicebot Applet] → [Hangup Applet]
Click Save.
Copy the App ID from the URL bar after saving. The URL will look like:
https://my.exotel.com/cloudexpertsindia1m/admin/Apps/42231
↑
App ID = 42231
Paste this number into the App ID field on Edesy's credential form (Step 2 above).
Why the App ID matters for outbound calls: Exotel's
/Calls/connectAPI requires aUrl=parameter that points at an Exotel-hosted call flow. Edesy templates this ashttp://my.exotel.com/<sid>/exoml/start_voice/<app_id>, which routes the outbound call through your Voicebot Applet App and bridges audio over the WebSocket. Without an App ID, Edesy can't construct that URL — the call will be issued by Exotel but won't ring the destination, and after ~34 seconds it'll fail withno-answer.
Tip — copy the URL from Edesy instead of typing it. Open Phone Numbers → your DID → Configure inbound webhook in the Edesy dashboard, link an agent, and the URL appears with a copy button. That avoids transcription errors in the long workspace ID.
Step 5: Assign the App to your phone number (inbound only)
This step is only required if you want to receive inbound calls to your Exotel DID. Outbound calls work without this — Edesy invokes your App directly via API for each outbound call (using the App ID from Step 4).
In the Exotel dashboard, go to ExoPhones, click the edit (pencil) icon next to your DID, and select the Custom App you created in Step 4 under the App dropdown.

Save. From this point on, every inbound call to your DID will connect directly to your Edesy voice agent over the WebSocket.
Want to skip this step? Edesy has an optional Auto-assign DID via API button that does exactly this for you — you'll need your Exotel Inbound App ID and ExoPhone SID (both visible in the Exotel dashboard URLs). Open Phone Numbers → your DID → Auto-assign DID via API and paste them in. This is a one-click alternative to manual assignment, useful if you manage multiple DIDs.
Step 6: Configure outbound calls (optional)
Outbound calls are initiated from the Edesy dashboard or via the API — there's no extra Exotel-side flow setup required. There are two account-level items worth checking:
IP whitelisting (some Exotel accounts)
Some Exotel accounts require Edesy's outbound IP to be whitelisted before outbound calls succeed.
- Email
[email protected]requesting IP whitelisting - Edesy support will share the outbound IP at the time of activation
- Confirm with Exotel once it's added
If unsure, skip this and only revisit if outbound calls fail with authorization errors.
NDNC (National Do Not Call) compliance — India only
For Indian phone numbers, Edesy automatically marks outbound calls as transactional (CallType=trans) to comply with TRAI's NDNC registry. Make sure NDNC scrubbing is enabled on your Exotel account so registered numbers are filtered automatically — otherwise outbound to a registered number will be rejected.
Testing your integration
Once Steps 1-5 are complete, run two quick tests to verify the setup end-to-end.
Inbound test
Dial your Exotel DID from any phone. You should:
- Hear your agent's configured greeting within ~2 seconds of the call connecting
- See the call appear in Call Logs on the Edesy dashboard within 30 seconds, with disposition Completed
- See the First inbound call received milestone flip to ✓ on the Phone Numbers page
- Receive a "Your first Exotel call connected" email from Edesy
Outbound test
- In the Edesy dashboard, open the agent matching the
<AGENT_ID>you used in Step 4 - Click Test Call, enter a destination phone number, and start the call
- The call should originate from your Exotel DID and connect the destination phone to your AI agent
Tip — automated inbound test. On the Phone Numbers page, click Test inbound call next to your DID. Edesy shows a live "Waiting for inbound call…" dialog and confirms the moment your call hits the webhook. You don't have to dig through call logs to verify.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
Outbound call returns SID but never rings the destination (times out at 34s, no-answer) |
App ID missing from Edesy credential | Complete Step 4 — create the Custom App, then paste the App ID into Edesy's credential edit form |
| Inbound rings, no AI picks up | Voicebot URL wrong, or Voicebot Applet not enabled on account | Re-check the wss:// URL in App Bazaar (Step 4); email Exotel support to confirm the Voicebot Applet is enabled (Step 3) |
| Inbound returns "application error" | Custom App not assigned to the DID | Re-check Step 5 — confirm the App is selected in ExoPhones |
| Outbound call fails with 401 | Bad credentials, or wrong Subdomain for your region | Regenerate API Key / Token in the Exotel dashboard. Verify the Subdomain field matches what Exotel shows on the API Settings page (e.g., api.in.exotel.com for Mumbai) |
| Outbound call fails with 404 Not Found | Subdomain doesn't match account region | Update Subdomain in Edesy → Phone Numbers → Edit Exotel to match Exotel's API Settings page exactly |
| Outbound fails with NDNC error | Number is on India's Do Not Call registry, or NDNC scrubbing is off on your Exotel account | Enable NDNC scrubbing on Exotel; CallType=trans is set automatically by Edesy |
| Bot speaks but doesn't understand the caller (replies generically or to nothing) | Voicebot Applet's wss URL has stale agent_id baked in, OR the wrong agent has been auto-routed |
Use a workspace-only URL (no agent_id in the path); confirm the agent dropdown in Phone Numbers → your DID is set correctly |
| Audio is one-way or garbled | Stream interrupted, or wrong applet selected | Contact Edesy support with the call's date/time — we'll check the WebSocket logs |
| Calls suddenly stop working | Exotel prepaid balance exhausted | Top up your Exotel wallet at my.exotel.com |
| API Key / Token reset on Exotel | Old credentials cached on Edesy side | Update credentials in Edesy → Phone Numbers → Edit Exotel and click Save |
Still stuck? Email
[email protected]or message us on WhatsApp (10 AM – 7 PM IST) with your Exotel SID and the approximate timestamp of a failed call. We have full WebSocket logs and can trace exactly what happened.
Going to production
A few things worth doing before pointing real traffic at the integration.
Enable call recording
In the Voicebot Applet (Step 4), enable the Record option. Recordings are stored on Exotel's storage and the URL is forwarded to Edesy — they appear inline in your Call Logs. Retention follows Exotel's account policy (typically 90 days; check your contract).
Monitor your Exotel balance
Exotel is prepaid — once the wallet hits zero, calls stop regardless of your Edesy credit balance. Set up low-balance alerts in your Exotel dashboard (Settings → Notifications) so your team is warned before service drops. Edesy doesn't proxy this — Exotel owns the telephony layer's billing.
Multi-DID setup
You can connect multiple Exotel DIDs to the same Edesy workspace. Each DID lives on its own row in Phone Numbers and can be linked to a different agent (e.g., one number for sales, another for support). The credentials in Step 1 are account-wide, so you only repeat Steps 4 and 5 per DID — and one Custom App can be shared across multiple DIDs if they should answer with the same agent.
Switching a DID between agents
Open Phone Numbers, expand the DID's card, and pick a different agent in the Agent dropdown. The change is live on the very next inbound call — no Exotel-side change required.
Cost reference
The total per-minute cost is the sum of the telephony charge (Exotel) and the AI usage charge (Edesy). For a typical Hindi inbound voice agent:
| Component | Provider (typical) | Approx. cost / minute |
|---|---|---|
| Telephony — Exotel inbound (India) | Exotel | ₹0.30 – ₹0.50 |
| Telephony — Exotel outbound (India local / national) | Exotel | ₹0.85 – ₹1.50 |
| STT | Sarvam Saarika | ₹0.56 |
| TTS | Sarvam Bulbul | ₹0.75 |
| LLM | Gemini 2.5 Flash-Lite | ₹0.04 |
| Total per inbound minute (India) | ~₹1.65 – ₹1.85 | |
| Total per outbound minute (India) | ~₹2.20 – ₹2.85 |
For native-audio agents (Gemini Live 2.5), STT + TTS collapse into a single LLM cost (~₹0.27/min input + ~₹1.08/min output), bringing AI cost closer to ₹1.35/min with significantly better latency.
Exotel rates depend on your contract. Check my.exotel.com → Pricing for your account's actual per-minute rate. The numbers above are typical mid-volume contract rates.
Frequently asked questions
Can I use the same Exotel number for inbound and outbound?
Yes. Once you complete Steps 1-5, the same DID handles inbound (via the Voicebot Applet) and acts as the caller ID on outbound calls placed from Edesy.
My Exotel account isn't in Mumbai — does this still work?
Yes. Edesy defaults to Mumbai (api.in.exotel.com) since most of our customers are based in India. If your Exotel account is in Singapore or US, enter the matching subdomain in the Subdomain field on the credential form (api.exotel.com or api.us.exotel.com). Edesy uses your subdomain for every Exotel API call.
Do I need to whitelist Exotel's IPs for inbound calls?
No. Inbound calls flow Exotel → Edesy via WebSocket — no whitelisting needed. Outbound calls go Edesy → Exotel, and some Exotel accounts require Edesy's IP to be whitelisted on their side. If outbound returns 401 errors, contact Exotel support and ask them to whitelist Edesy's IPs.
What happens to in-flight calls if I delete an Exotel credential?
In-flight calls continue to completion — the WebSocket is already established, and deleting the credential row doesn't drop active connections. New inbound calls from that DID will fail until you reconnect the credential or assign the DID to a different App in Exotel.
Can I use the same Exotel credential across multiple Edesy workspaces?
No — credentials are workspace-scoped. If your team has multiple workspaces and you want to use the same Exotel account in each, add the credential separately in each workspace.
Can I switch from the legacy Passthru Applet to the Voicebot Applet without downtime?
Yes. Edit your Custom App in App Bazaar, replace the Passthru applet with a Voicebot applet using the wss:// URL from Step 4, and save. The change takes effect on the next inbound call. (Edesy keeps the legacy HTTP /answer endpoint working for backward compatibility, so existing Passthru setups don't need to migrate immediately.)
Do I need a separate Exotel App for each agent in my workspace?
No. One App handles all your agents. The Voicebot Applet URL contains only your workspace_id (no agent_id); Edesy passes the per-call agent ID via Exotel's CustomField parameter for outbound calls, and uses the agent assignment on the DID (set in Phone Numbers → Configure inbound webhook) for inbound calls. If you have ten agents and one Exotel DID, you still only configure one App.
Should I set the Voicebot Applet's "Sample Rate" to 16 kHz?
No, leave it at the default (8 kHz). Edesy auto-upsamples Exotel's 8 kHz audio to 16 kHz internally — that's the rate our LLMs expect. Setting 16 kHz on the Exotel side works too but provides no quality benefit (the audio is already 8 kHz on the PSTN, so 16 kHz on the wire is just zero-padded). Default is fine.
Why does my outbound call return a SID but never ring the destination?
You haven't filled in the App ID field on Edesy's credential. Without it, Edesy can't construct the Exotel call-flow URL, and Exotel falls through to your DID's auto-provisioned default App (which is empty). The call SID is created but the customer's phone never rings. Complete Step 4, paste the App ID into Edesy → Phone Numbers → Edit Exotel, and outbound will work.
Next steps
- Creating an Agent — set up the agent your Exotel number will route calls to
- System Prompt Configuration — define your agent's personality and behaviour
- BYOP Setup — overview of all bring-your-own-provider integrations
- Telephony Providers Guide — compare Exotel against Twilio and Plivo
- Exotel Integration (technical reference) — WebSocket message format, audio specs, and API details for engineers integrating directly