Integrate Exotel cloud telephony into the workflow. Connect a sales rep to a lead, send an IVR call flow to a customer, send DLT-compliant SMS, look up call and SMS records, and check an Indian number for operator and DND status. Can also run workflows when Exotel reports a call or SMS status. Requires an Exotel API key, API token, and Account SID.
Place an outbound call that rings the From number first (for example a sales rep) and, once answered, dials the To number (for example a lead) and connects them through your ExoPhone.
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
from | string | Yes | Number called first, in E.164 format (e.g. +919900XXXXXX) or a SIP URI (e.g. sip:agent@exotel.com) |
to | string | Yes | Customer number called second, in E.164 format (e.g. +918800XXXXXX) |
callerId | string | Yes | Your ExoPhone (virtual number) shown to both parties |
record | boolean | No | Whether to record the conversation |
recordingChannels | string | No | Recording channels: "single" (default) or "dual" |
recordingFormat | string | No | Recording format: "mp3" (default) or "mp3-hq" |
waitUrl | string | No | URL of a WAV file played to the first party while the second is dialed |
callType | string | No | Set to "trans" for transactional calls |
timeLimit | number | No | Maximum call duration in seconds (max 14400) |
timeOut | number | No | Seconds to ring each called party before treating the leg as unanswered |
customField | string | No | Metadata echoed back in the StatusCallback and to Passthru applets, e.g. a lead or order ID (max 128 characters) |
statusCallback | string | No | URL Exotel posts the call status to, such as an Exotel Call Status trigger URL |
statusCallbackEvents | string | No | Events that send the extended StatusCallback payload: "terminal", "answered", or "both". Without it the callback carries only CallSid, Status, DateUpdated, and RecordingUrl. |
statusCallbackContentType | string | No | Encoding of the StatusCallback POST: "application/json" (default when a StatusCallback is set) or "multipart/form-data" |
| Parameter | Type | Description |
|---|
callSid | string | Unique call identifier (Sid) |
parentCallSid | string | Parent call Sid |
accountSid | string | Exotel Account SID |
status | string | Call status: queued, in-progress, completed, failed, busy, or no-answer |
from | string | The number called first |
to | string | The destination number (null when the call goes to a call flow) |
phoneNumberSid | string | The ExoPhone used |
direction | string | Call direction: inbound, outbound-dial, or outbound-api |
dateCreated | string | When the call request was created |
dateUpdated | string | Last status update time |
startTime | string | When the call was sent to the operator |
endTime | string | When the call ended |
duration | number | Total duration in seconds. Updates about 2 minutes after the call ends. |
price | string | Amount charged (INR or USD). Updates about 2 minutes after the call ends. |
answeredBy | string | Who answered the call, if reported |
recordingUrl | string | Recording URL when recording was enabled and the call has ended |
uri | string | API path of the call resource |
Call a number and, once they answer, hand the call to an Exotel call flow (IVR or applet app) built in App Bazaar.
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
from | string | Yes | Number to call, preferably in E.164 format. Prefix landlines with the STD code. |
callerId | string | Yes | Your ExoPhone (virtual number) |
appId | string | Yes | ID of the call flow (app) to connect to, from App Bazaar > My Apps |
callType | string | No | Set to "trans" for transactional calls |
timeLimit | number | No | Maximum call duration in seconds (max 14400) |
timeOut | number | No | Seconds to ring each called party before treating the leg as unanswered |
customField | string | No | Metadata echoed back in the StatusCallback and to Passthru applets, e.g. a lead or order ID (max 128 characters) |
statusCallback | string | No | URL Exotel posts the call status to, such as an Exotel Call Status trigger URL |
statusCallbackEvents | string | No | Events that send the extended StatusCallback payload: "terminal", "answered", or "both". Without it the callback carries only CallSid, Status, DateUpdated, and RecordingUrl. |
| Parameter | Type | Description |
|---|
callSid | string | Unique call identifier (Sid) |
parentCallSid | string | Parent call Sid |
accountSid | string | Exotel Account SID |
status | string | Call status: queued, in-progress, completed, failed, busy, or no-answer |
from | string | The number called first |
to | string | The destination number (null when the call goes to a call flow) |
phoneNumberSid | string | The ExoPhone used |
direction | string | Call direction: inbound, outbound-dial, or outbound-api |
dateCreated | string | When the call request was created |
dateUpdated | string | Last status update time |
startTime | string | When the call was sent to the operator |
endTime | string | When the call ended |
duration | number | Total duration in seconds. Updates about 2 minutes after the call ends. |
price | string | Amount charged (INR or USD). Updates about 2 minutes after the call ends. |
answeredBy | string | Who answered the call, if reported |
recordingUrl | string | Recording URL when recording was enabled and the call has ended |
uri | string | API path of the call resource |
Get the status, duration, price, and recording URL of one call by its Sid, optionally with per-leg details.
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
callSid | string | Yes | Sid of the call, as returned when the call was placed |
includeDetails | boolean | No | Include leg-level details (conversation duration and per-leg status) |
| Parameter | Type | Description |
|---|
callSid | string | Unique call identifier (Sid) |
parentCallSid | string | Parent call Sid |
accountSid | string | Exotel Account SID |
status | string | Call status: queued, in-progress, completed, failed, busy, or no-answer |
from | string | The number called first |
to | string | The destination number (null when the call goes to a call flow) |
phoneNumberSid | string | The ExoPhone used |
direction | string | Call direction: inbound, outbound-dial, or outbound-api |
dateCreated | string | When the call request was created |
dateUpdated | string | Last status update time |
startTime | string | When the call was sent to the operator |
endTime | string | When the call ended |
duration | number | Total duration in seconds. Updates about 2 minutes after the call ends. |
price | string | Amount charged (INR or USD). Updates about 2 minutes after the call ends. |
answeredBy | string | Who answered the call, if reported |
recordingUrl | string | Recording URL when recording was enabled and the call has ended |
uri | string | API path of the call resource |
details | json | Leg-level details, present only when Include Details is on |
↳ conversationDuration | number | Seconds both parties were connected |
↳ leg1Status | string | Status of the first leg |
↳ leg2Status | string | Status of the second leg |
↳ legs | array | Per-leg durations |
↳ id | number | Leg number (1 or 2) |
↳ onCallDuration | number | Seconds the leg was on the call |
List call records (bulk Call Details) filtered by date range, numbers, status, direction, duration, or price, with cursor pagination. Covers up to 6 months of history, at most 1 month per request.
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
callSids | string | No | One call Sid or a comma-separated list (max 100) |
startDate | string | No | Only calls created at or after this time, as YYYY-MM-DD HH:mm:ss |
endDate | string | No | Only calls created at or before this time, as YYYY-MM-DD HH:mm:ss |
to | string | No | Called number(s) in E.164 format, up to 5 comma-separated |
from | string | No | Calling number(s) in E.164 format, up to 5 comma-separated |
status | string | No | Call status: completed, failed, busy, or no-answer |
direction | string | No | Call direction: inbound, outbound-dial, or outbound-api |
phoneNumber | string | No | ExoPhone(s) the calls used, up to 5 comma-separated |
durationFilter | string | No | Duration range, e.g. "gte:10s;lte:45s" or "eq:30s" |
priceFilter | string | No | Price range, e.g. "gte:0.10;lte:1.0" |
pageSize | number | No | Records per page (default 50, max 100) |
sortBy | string | No | Sort order: "DateCreated:asc" or "DateCreated:desc" (default) |
after | string | No | Cursor for the next page (nextCursor from a previous call) |
before | string | No | Cursor for the previous page (prevCursor from a previous call) |
recordingUrlValidity | number | No | Minutes the pre-signed recording URLs stay valid (5 to 60) |
| Parameter | Type | Description |
|---|
calls | array | Matching calls, newest first unless sorted otherwise |
↳ callSid | string | Call Sid |
↳ status | string | Call status |
↳ from | string | Calling number |
↳ to | string | Called number |
↳ direction | string | Call direction |
↳ dateCreated | string | When the call was created |
↳ duration | number | Duration in seconds |
↳ price | string | Amount charged |
↳ recordingUrl | string | Recording URL, if recorded |
total | number | Total calls matching the filters |
pageSize | number | Records per page |
firstPageUri | string | API path of the first page |
prevPageUri | string | API path of the previous page |
nextPageUri | string | API path of the next page |
nextCursor | string | Pass as After to fetch the next page (null on the last page) |
prevCursor | string | Pass as Before to fetch the previous page |
Send one SMS from an ExoPhone or approved Sender ID. SMS to Indian numbers must carry the DLT Entity ID and match a DLT-approved template, or operators block it.
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
from | string | Yes | ExoPhone or DLT-registered Sender ID (header), e.g. EXOTEL |
to | string | Yes | Recipient mobile number, preferably in E.164 format |
body | string | Yes | Message text, max 2000 characters. For India it must match the approved DLT template exactly, with only the {#var#} positions filled in. |
dltEntityId | string | No | DLT entity registration ID. Mandatory for SMS to Indian numbers. |
dltTemplateId | string | No | DLT-approved template ID the body matches. If omitted, Exotel looks up the matching template on your dashboard. |
smsType | string | No | transactional (OTP or service implicit), transactional_opt_in (service explicit), or promotional. If omitted, Exotel uses the matching template. |
encodingType | string | No | "plain" (default, auto-detected) or "unicode" |
priority | string | No | "normal" (default) or "high". Use high only for OTP, bank, or delivery SMS. |
shortenUrl | boolean | No | Shorten URLs in the body. A paid feature that must be enabled on the account. |
customField | string | No | Your reference, e.g. an order ID, echoed back in the delivery callback |
statusCallback | string | No | URL Exotel posts delivery status to, such as an Exotel SMS Status trigger URL |
bindingChainDetails | string | No | Telemarketer aggregators in India only: comma-separated <PE_ID>,<YOUR_TM_ID> |
| Parameter | Type | Description |
|---|
smsSid | string | Unique SMS identifier (Sid) |
accountSid | string | Exotel Account SID |
from | string | Sender, as <ExoPhone>/<SenderID> |
to | string | Recipient number |
body | string | Message content |
status | string | High-level status: queued, sending, submitted, sent, failed-dnd, or failed |
detailedStatus | string | Human-readable status, e.g. DELIVERED_TO_HANDSET |
detailedStatusCode | string | Exotel numeric status code, e.g. 20005 |
direction | string | outbound-api, outbound-call, outbound-reply, or incoming |
smsUnits | number | SMS units consumed (null until the final state) |
dateCreated | string | When the request was received |
dateUpdated | string | Last status update time |
dateSent | string | When the SMS was delivered |
price | string | Amount charged, once final |
uri | string | API path of the SMS resource |
Get the delivery status of one SMS by its Sid, including the detailed status code (e.g. DELIVERED_TO_HANDSET).
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
smsSid | string | Yes | Sid of the SMS, as returned when it was sent |
| Parameter | Type | Description |
|---|
smsSid | string | Unique SMS identifier (Sid) |
accountSid | string | Exotel Account SID |
from | string | Sender, as <ExoPhone>/<SenderID> |
to | string | Recipient number |
body | string | Message content |
status | string | High-level status: queued, sending, submitted, sent, failed-dnd, or failed |
detailedStatus | string | Human-readable status, e.g. DELIVERED_TO_HANDSET |
detailedStatusCode | string | Exotel numeric status code, e.g. 20005 |
direction | string | outbound-api, outbound-call, outbound-reply, or incoming |
smsUnits | number | SMS units consumed (null until the final state) |
dateCreated | string | When the request was received |
dateUpdated | string | Last status update time |
dateSent | string | When the SMS was delivered |
price | string | Amount charged, once final |
uri | string | API path of the SMS resource |
Look up the telecom circle, operator, number type (mobile or landline), and DND status of an Indian phone number.
| Parameter | Type | Required | Description |
|---|
apiKey | string | Yes | Exotel API key (the Basic auth username), from Settings > API Settings |
apiToken | string | Yes | Exotel API token (the Basic auth password), from Settings > API Settings |
accountSid | string | Yes | Exotel Account SID, used in every API path |
subdomain | string | Yes | Regional API host of the account: "api.exotel.com" (Singapore) or "api.in.exotel.com" (Mumbai) |
phoneNumber | string | Yes | Indian phone number to look up, e.g. 09876543210 |
| Parameter | Type | Description |
|---|
phoneNumber | string | The number, reformatted by Exotel |
circle | string | Two-character telecom circle code, e.g. MH |
circleName | string | Telecom circle name, e.g. Maharashtra |
type | string | Mobile or Landline |
operator | string | Operator code, e.g. A for Airtel |
operatorName | string | Operator name |
dnd | string | DND (Do Not Disturb) status: Yes, No, or Unavailable |
A Trigger is a block that starts a workflow when an event happens in this service.
Trigger workflow when Exotel reports a call status (answered or ended) through a StatusCallback or Passthru applet
| Parameter | Type | Description |
|---|
callSid | string | Unique call identifier (CallSid) |
status | string | Call status: completed, failed, busy, or no-answer (in-progress on answered events) |
eventType | string | terminal or answered. Sent only when Status Callback Events was set. |
from | string | Calling number (From, or CallFrom on a Passthru request) |
to | string | Called number (To, or CallTo on a Passthru request) |
phoneNumberSid | string | The ExoPhone used |
direction | string | inbound, outbound-dial, or outbound-api |
dateCreated | string | When the call request was created |
dateUpdated | string | Last status update (YYYY-MM-DD HH:mm:ss) |
startTime | string | When the call started |
endTime | string | When the call ended |
duration | number | Total call duration in seconds, when Exotel includes Duration |
conversationDuration | number | Seconds both parties were connected |
recordingUrl | string | Recording URL, when recording was enabled |
customField | string | The Custom Field sent with the original call, e.g. a lead or order ID |
legs | json | Per-leg attempts, each { onCallDuration, status, answeredBy }. status is completed, busy, failed, no-answer, canceled, or null; answeredBy is Human, Machine, NotSure, or NA. |
currentTime | string | Request time, sent only by the Passthru applet |
raw | json | The complete payload Exotel sent |
Trigger workflow when Exotel reports a delivery status change for an outbound SMS
| Parameter | Type | Description |
|---|
smsSid | string | Unique SMS identifier (SmsSid) |
accountSid | string | Exotel Account SID |
from | string | Sender ID or ExoPhone used |
to | string | Recipient number |
status | string | Delivery status, e.g. sent, delivered, or failed |
detailedStatus | string | Detailed status, e.g. DELIVERED_TO_HANDSET or FAILED_DND |
detailedStatusCode | string | Exotel numeric status code, e.g. 20005 |
smsUnits | number | SMS units consumed |
dateSent | string | When the SMS was sent |
dateUpdated | string | When the status changed |
customField | string | The Custom Field sent with the SMS, e.g. an order ID |
raw | json | The complete payload Exotel sent |