Exotel App Bazaar setup
Exotel App Bazaar setup
Exotel is the one carrier where connecting your credentials is not enough on its own. The other providers use a webhook model — Telenow dials, the carrier calls back for instructions. Exotel has no such callback: the dial names a call flow that must already exist in your account, and that flow is what hands the answered call to the agent.
So a BYOC Exotel connection needs two things from your Exotel account: the credentials, and the App ID of a flow you build once in App Bazaar.
Leaving the App ID blank is allowed. The connection still works for inbound calls and numbers still import — but every outbound dial is refused before it is placed, because there is nothing to connect the answered call to.
Before you start
Two account-level requirements sit outside Telenow entirely, and neither produces an obvious error:
- KYC. Until your KYC is submitted and approved, Exotel only lets you call numbers that are added and verified on your own account. A trial account with KYC not started cannot dial arbitrary mobiles no matter how the flow is built.
- Credit. Exotel accounts are prepaid. A zero or negative balance refuses outbound calls. Telenow reads your balance whenever a dial is rejected and will tell you plainly when this is the cause.
1. Build the flow
In the Exotel dashboard, open App Bazaar from the side menu and choose Create New App (or edit an existing one).
Voicebot — the agent
On the Call Start block, drag in a Voicebot applet and set its URL to:
https://api.telenow.ai/webhooks/exotel/wss-url
Exotel fetches that URL per call and expects JSON with a url key; Telenow returns the media-socket address for that specific call. Leave Record this? unchecked — Telenow records both legs itself, so Exotel-side recording only duplicates it.
Use the host your account actually runs on.
api.telenow.aiis the default. If you reach Telenow on your own domain — a white-label or reseller deployment — use that host instead. The exact URL for your account is printed in the connect form itself (Developers → Carriers → Connect carrier → Exotel), so copy it from there rather than typing it.
Pick the Voicebot applet, not Stream. Stream is one-way: it forks a copy of the call audio to you for transcription, with no way to send audio back, so the caller would hear silence. Voicebot is bidirectional, which is what an agent needs. (Exotel's newer material calls this capability AgentStream — same applet, not the Stream one in the palette.)
That alone is enough for calls to work. The next two applets are only for transfer to a human.
Passthru — the branch
Inside the Voicebot's Next → Continue to the next applet slot, drop a Passthru applet:
- URL:
https://api.telenow.ai/webhooks/exotel/passthru - Method: GET
- Make Passthru Async: leave unchecked
Sync mode matters. In async mode Exotel ignores your response code, the branch never happens, and transfers silently never fire.
Passthru gives a binary branch. Telenow returns 302 when the agent has staged a transfer for that call and 200 when it hasn't:
| Response | Meaning | What to put there |
|---|---|---|
200 OK | No transfer — the call is simply over | Leave empty, or a Hangup applet |
anything else (302) | Transfer staged | The Connect applet below |
Connect — the human
On the 302 / "anything else" branch, drop a Connect applet. Under How do you want to control your Connect params?, select Configure parameters dynamically by providing a URL — this is easy to miss, because you can type into the URL field while the other option is still selected, leaving it inert.
- Primary URL:
https://api.telenow.ai/webhooks/exotel/connect-target - Fallback URL: leave empty
Telenow returns the destination the agent staged, along with the caller ID, ring timeout, and recording flag. Once dynamic mode is on, the Dial Whom and Distribute Calls sections stop applying.
Then Save.
2. Copy the App ID
Back on the App Bazaar page, the App ID is the number shown next to your app's name. It is also the last segment of the flow's ExoML URL:
http://my.exotel.com/<account sid>/exoml/start_voice/<app id>
3. Connect it in Telenow
Under Developers → Carriers → Connect carrier, choose Exotel and fill in:
| Field | Where it comes from |
|---|---|
| API key / API token | Exotel dashboard → API Settings |
| Account SID | Exotel dashboard → API Settings |
| API cluster | api.exotel.com (Singapore) or api.in.exotel.com (Mumbai) — a mismatch reads as a credential failure |
| App ID | The number from step 2 |
Telenow verifies the credentials against Exotel on save and imports your ExoPhones. Outbound calls on those numbers then run under your Exotel account, on your flow, at your rates.
Re-connecting the same credentials later updates the existing connection rather than creating a duplicate, so this is also how you add an App ID to a connection made before you had one.
What Exotel does not support
Carrier answer events. Exotel's StatusCallbackEvents parameter — the one that carries the AnsweredBy machine-detection verdict on other carriers — is documented as not applicable when the dial names a flow, which is always the case here. Sending it anyway makes Exotel reject the whole call.
The practical effect is narrow: machine detection on Exotel falls back to Telenow's transcript-based detection, and the browser learns of pickup when the media socket connects rather than a moment earlier at answer. Call disposition, duration, billing and recording are unaffected — those ride the plain status callback, which works normally.