This guide explains how to connect your Exotel phone numbers directly to ElevenAgents. This integration allows you to use your existing Exotel numbers and infrastructure while leveraging ElevenLabs’ advanced voice AI capabilities, for both inbound and outbound calls.
Voicebot applet (inbound + outbound media): An ExoML applet on Exotel that opens a WebSocket to ElevenLabs and streams the call’s audio in both directions.
Connect API (outbound dialing): For outbound calls, ElevenLabs calls Exotel’s Calls/connect.json endpoint using your API Key and API Token. Exotel dials the destination and, when the leg is answered, routes the audio through the same Voicebot applet to ElevenLabs.
For inbound calls, Exotel routes incoming calls to the Voicebot applet you assign to the phone number, which opens the WebSocket to ElevenLabs.
For outbound calls, ElevenLabs initiates the call via the Connect API and Exotel bridges the call back through the Voicebot applet.
Before anything else, contact Exotel support and ask them to:
Enable the Voicebot applet on your account. It is gated by default and won’t appear in the App Bazaar until your account has been provisioned for it.
Provision the number of channels (concurrent calls) you need. This is the cap on simultaneous Voicebot calls Exotel will let your account run. Size it for your expected peak traffic.
In the Exotel dashboard, open the left-hand Monitor menu and click Developer. This opens the API credentials page where you can read the Account SID, API Key and API Token.
You will need four values:
Account SID: Your Exotel account SID.
API Key: The username portion of the Exotel API credentials.
API Token: The password portion of the Exotel API credentials. Keep this secret.
Region (API subdomain): The cluster your Exotel account lives in. This is either api.exotel.com (Singapore) or api.in.exotel.com (Mumbai). You can confirm which one by looking at the host of any API URL shown on the Developer page.
ElevenLabs uses the API Key + API Token for HTTP Basic Auth when calling Exotel’s Connect API for outbound dialing.
Create a Voicebot applet in App Bazaar
In the Exotel dashboard, open the left-hand Manage menu and click App Bazaar.
Click Create / Add New Flow and give the app a descriptive name (e.g. ElevenLabs), then click OK.
From the applet palette on the right, drag the Voicebot applet onto the Call Start canvas.
Open the Voicebot applet’s configuration and paste the ElevenLabs WebSocket URL for your residency into the URL field (the “Which bot you want to connect the enduser?” field):
If your ElevenLabs account is on EU or India residency, use the matching residency URL from the table above (e.g. wss://api.in.residency.elevenlabs.io/v1/convai/conversation/exotel) instead of the default api.elevenlabs.io.
The rest of the Voicebot options (“Record this?”, “Recording Channels”, “Recording Format”, “Encrypt DTMF”) can stay at their defaults unless you have a specific recording or compliance need.
(Optional) Chain a Connect applet for human transfers. Skip this if you don’t need the agent to be able to transfer the call to a human. If you want to use the agent’s Transfer to number tool, you must add a Connect applet immediately after the Voicebot applet in the flow.
From the Voice Applets palette on the right, drag the Connect applet into the Next → Continue to the next applet slot of the Voicebot.
In the Connect applet’s configuration, choose Configure parameters dynamically by providing a URL and paste the ElevenLabs connect-applet endpoint for your residency into Primary URL:
When the agent invokes its Transfer to number tool, ElevenLabs hands control back to Exotel and Exotel fetches this URL to retrieve the destination number to dial. Leave Fallback URL empty and keep all other defaults.
Save and publish the applet.
Note the Applet ID (sometimes called App ID). You’ll find it in the URL of the ExoML editor (e.g. .../exoml/start_voice/12345) or in the App list. You will need this when importing the number into ElevenLabs.
Assign the flow to a phone number (inbound only)
Save and publish the ExoML flow from the previous step. Then route an Exotel phone number to it so inbound calls land on your Voicebot applet.
In the Exotel dashboard, open the left-hand Manage menu and click ExoPhones (just below App Bazaar).
If you don’t already have a phone number, click Buy a number and purchase one in the country / area you need before continuing.
Find the number you want to use with your ElevenLabs agent. In its Installed App column, open the dropdown and select the flow you created in the previous step (e.g. ElevenLabs).
Save the configuration. Incoming calls to that number will now be routed straight into the Voicebot applet and streamed to ElevenLabs.
In the ElevenAgents dashboard, go to the Phone Numbers tab. Click + Import number and select From Exotel from the dropdown.
Fill in the following fields:
Label: A descriptive name (e.g. Support Line).
Phone number: The Exotel number in E.164 format (e.g. +918048961234).
Exotel Account SID: From step 1 above.
Exotel API Key: From step 1 above.
Exotel API Token: From step 1 above (stored as a workspace secret).
Region: Pick Singapore (api.exotel.com) or Mumbai (api.in.exotel.com) matching your Exotel cluster.
Voicebot Applet ID: The App ID from step 2 above.
Click Import to save the number. ElevenLabs will verify the credentials against Exotel and store the API token as a workspace secret.
Assign your agent
Once the number is imported, open it from the Phone Numbers list and pick the agent that should handle inbound calls in the Assigned agent dropdown.
Test an inbound call
Call your Exotel number from any phone. The call will be routed by Exotel to the Voicebot applet, which opens a WebSocket to ElevenLabs. Your agent will pick up and start the conversation.
Imported Exotel numbers can also initiate outbound calls. Your agent dials a phone number and starts the conversation when the recipient picks up.
Initiate an outbound call
From the Phone Numbers tab, locate your Exotel number and click the Outbound call button.
Configure the call
In the Outbound Call modal:
Select the agent that will handle the conversation.
Enter the recipient’s phone number in E.164 format.
Click Send Test Call to initiate the call.
ElevenLabs calls Exotel’s Connect API with your stored credentials. Exotel dials the recipient and routes the audio back through the Voicebot applet when the call is answered.
To trigger outbound calls programmatically instead of from the dashboard, use the Outbound call via Exotel endpoint. The API reference includes the request schema and ready-to-use SDK snippets.
The Voicebot applet streams audio at 8 kHz PCM. The ElevenLabs platform handles the audio format conversion automatically. You do not need to change your agent’s TTS or input audio settings.
Phone numbers are stored in E.164 format (e.g. +918048961234). When importing an Indian Exotel number that you might write locally as 08048961234 or 8048961234, enter it as +918048961234. ElevenLabs will reject duplicate imports of the same number in different formats.
You can transfer calls from your agent back to Exotel by configuring a Transfer to number tool on your agent. When the tool fires, ElevenLabs ends the Voicebot leg and Exotel fetches the destination number from the chained Connect applet’s dynamic URL, then dials the target.
For this to work you need both:
The optional Connect applet configured immediately after the Voicebot applet in your ExoML flow (see step 5 in Setup on Exotel).
The Transfer to number tool configured on your agent. See the agent transfer guide.
Without the Connect applet in the flow, the agent’s transfer attempts will fail because Exotel will have nowhere to route the call after the Voicebot ends.
exotel_connect_failed error when starting an outbound call
ElevenLabs received a non-200 response from Exotel’s Connect API. The most common causes are:
Wrong Region. Make sure the region you picked at import time matches the Exotel cluster your account lives in (Singapore vs Mumbai).
Invalid API Key or API Token. Re-check the credentials in the Exotel API Settings page and re-import the number with the correct values.
The Account SID does not match the API Key / Token pair.
The destination number is not in E.164 format.
Inbound calls don't reach my agent
Confirm the Voicebot applet’s URL field matches the ElevenLabs WebSocket endpoint for your data residency exactly (including wss://).
Confirm the Exotel phone number is routed to the ExoML app that contains the Voicebot applet (Exotel dashboard, ExoPhones, the number, Installed App).
In ElevenLabs, confirm the phone number has an agent assigned in the Phone Numbers tab.
Applet ID mismatch errors when importing
The Voicebot Applet ID field expects the numeric App ID from the ExoML editor URL (e.g. for .../exoml/start_voice/12345 the ID is 12345). Don’t paste the full URL. Use only the ID.
Phone number imported twice in different formats
ElevenLabs normalizes Exotel numbers to E.164 before storing them, and enforces uniqueness on (provider, phone_number). If you previously imported the same number in a non-E.164 format, delete the old entry first and then re-import it in E.164 form.