What are Call Insights?


Call insights are richer data points to help you uncover details about your voice calls and are computed by Exotel's AI system.

At times, the call statuses received from operators aren't correct or due to the nature of telecom signalling the status are not computed correctly if calls are terminated during the hangup message.

Whenever we make a call from our phone, we know that the number on the other side is ringing, switched off, busy etc. However, in the telephony stack where machines are making and receiving calls, such information is dependent on the dated telephony infrastructure and protocols which at times isn't computing the correct information.

The aim of this solution is to give you much better call statuses and richer call insights as computed by our AI system which was not possible with traditional telephony data.


How can I use this?


This feature is currently available under private beta only to select clients and is chargeable. If you are interested, speak to your account manager or drop an email to hello@exotel.in and we'd review your request.

How to capture Call Insights via Passthru?


Once this is enabled for your account, you can subscribe to Call Insights data in Passthru Applet like below (please note, Passthru needs to be present immediately after Connect Applet where the destination number(s) will be attempted and insights would be computed).



If an application URL is set in Passthru applet, Exotel will make a GET request to the URL with the call details as URL-encoded HTTP query parameters as per the documentation present here. In addition to existing Passthru parameters, Exotel will pass ‘Insights’ data if it is subscribed.

Sample Payload (Query Params):

DialWhomNumber=07380862xxx

flow_id=317824

tenant_id=85291

From=08296658xxx

To=02248966xxx

RecordingAvailableBy=Sun, 28 Feb 2021 21:11:10

CurrentTime=2021-02-28 21:06:10

OutgoingPhoneNumber=02248966xxx

Legs[0][Number]=09763735xxx

Legs[0][Type]=single

Legs[0][OnCallDuration]=0

Legs[0][CauseCode]=RING_TIMEOUT

Legs[0][Cause]=1003

Legs[0][DisconnectedBy]=Exotel

Legs[0][Insights][DisconnectedBy]=Callee

Legs[0][Insights][Status]=busy

Legs[0][Insights][DetailedStatus]=BUSY_REJECTED

Legs[0][Insights][RingingDuration]=1.9

Legs[1][Number]=07380862xxx

Legs[1][Type]=single

Legs[1][OnCallDuration]=591

Legs[1][CauseCode]=NORMAL_CLEARING

Legs[1][Cause]=16

Legs[1][DisconnectedBy]=Caller

Legs[1][Insights][DisconnectedBy]=Caller

Legs[1][Insights][Status]=completed

Legs[1][Insights][DetailedStatus]=CALL_COMPLETED

Legs[1][Insights][RingingDuration]=4.39

Insights[DialCallStatus]=completed

*Legs[n] array would contain `n` elements where n is the unique numbers attempted during the connect applet execution.

**The outer 'Legs' array is powered based on data provided by the operators whereas the parameters within Legs[x][Insights] is computed by Exotel's internal AI system.


Explanation


  • Insights[DialCallStatus]

    This is the overall status of the dial attempt of the connect applet as computed by Exotel's AI system. If more than 1 destination number was attempted, this status would be set based on last attempt.

    Possible statuses and meaning

    DialCallStatusMeaning
    completedThe call was answered and has ended normally
    no-answer
    The call was not answered by the caller (it was ringing or no-answer message was played)
    busyThe call could not be connected as the destination number was busy on another call.
    failedThe call could not be completed as dialled due to an invalid phone number, number being switched off etc.
    canceled

    The call was disconnected by Caller (Leg1) during an attempt or ringing of destination number.



  • Legs[x][Insights][Status]

    This is the status of the individual leg attempted during Connect applet as computed by Exotel's AI system.

    Possible statuses and meaning

    DialCallStatusMeaning
    completedThe call was answered and has ended normally
    no-answer
    The call was not answered by the caller (it was ringing or no-answer message was played)
    busyThe call could not be connected as the destination number was busy on another call.
    failedThe call could not be completed as dialled due to an invalid phone number, number being switched off etc.
    canceled

    The call was disconnected by Caller (Leg1) during an attempt or ringing of destination number.


  • Legs[x][Insights][DetailedStatus]

    DialCallStatus powers the overall status of the call. This field powers a more granular status of the call leg attempt to understand the detailed reason.

    DetailedStatus

    DialCallStatus

    Description

    BUSY_REJECTED

    busy


    Destination number was ringing wherein user disconnected the call and busy message tone was heard after ringing

    BUSY_TONE

    busy


    Busy message tone was heard while dialling the destination number without any ringing

    CALL_WAITING

    busy


    Call waiting message was heard while dialling the destination number

    NO_ANSWER_RINGING

    no-answer


    The destination number was ringing and no one answered

    NO_ANSWER_RINGING_TIMEOUT

    no-answer


    The destination number was ringing and no one answered until the ringing timeout threshold was reached (as defined in Connect applet, default is 30 seconds)

    NO_ANSWER_TONE

    no-answer


    The destination number was ringing and no answer message was heard.

    FAILED_SUBSCRIBER_UNAVAILABLE

    failed


    The destination number is switched off or out of network coverage area.

    FAILED_INVALID_DESTINATION_NUMBER

    failed


    The destination number is invalid.


    FAILED_SUBSCRIBER_ERROR

    failed


    Call attempt to destination number has failed due to a subscriber error such as incoming call is barred or is number is temporarily disconnected.

    FAILED_OPERATOR_ERROR

    failed


    Call attempt to destination number has failed due as the operator could not connect the call. Scenarios such as the entire call attempt only had dead air sound or beep tone.

    FAILED_UNKNOWN_ERROR

    failed


    Call attempt to destination number has failed and the reason is not known. This can occur if the failure message is insufficient or unknown to the system.

    CANCELED_RINGING

    canceled


    Call was disconnected by Caller during ringing of destination number before the timeout period elapsed or no answer message was played.


    To be used for DialCallStatus/Leg2Status only and not for 'Legs'

    CANCELED_INCOMPLETE_ATTEMPT

    canceled


    Call was disconnected by Caller during attempt (within 10 seconds) of destination number without conclusion of terminal state (this can include insufficient message, beep, silence or unknown).


    To be used for DialCallStatus/Leg2Status only and not for 'Legs'

    CALL_COMPLETED

    completed


    Call was connected and picked up

    NO_DIAL

    N/A (empty)


    Outgoing Leg was not present at all.


  • Legs[x][Insights][DisconnectedBy]

    This indicates who hung up the call or was responsible for the hang-up of the call.

    Possible Values

    Description

    Caller

    In case of Incoming calls, the number dialing into the Exophone (virtual number) has disconnected the call i.e. ‘From’ number.

    Callee

    The call was hung up by the destination number who was dialed i.e. Leg[i][Number] where i represents the index of the numbers returned from Connect URL.


    For a single number, Legs[0][Number] would indicate the number that disconnected.

    Exotel

    This would indicate that Exotel has initiated the disconnection of the call. It will include cases such as ‘Ringing Timeout’ (the call attempt exceeded the maximum time threshold) or ‘Time Limit (the call conversation exceeded the maximum time) as set in Connect Applet or allowed by Exotel (default values).

    Operator

    This would indicate that the disconnection was due to an underlying connectivity cause of the network carrier. It will include cases such as ‘Busy without ring’, ‘No answer message’, ‘Failed calls’ etc.

    NA

    The source of the hangup is not applicable to this case.


  • Legs[x][Insights][RingingDuration]This indicates how long the destination number rang (in seconds). This would be set to 0 if the handset didn't ring.

*If you have more than 1 destination number, the array would contain insights about all the numbers that were attempted like Legs[0][Insights], Legs[1][Insights] .... Legs[n][Insights]Insights[Legs][n][] where n is the unique numbers attempted during the connect applet execution.