Identify CTI data

Third-party CTI fields are based on events received from the switch. You can identify the third-party CTI attributes available for use by examining the Integration Service logs.

Before you begin 

Configure the Recorder and an Integration Service adapter.

Procedure 

  1. Ensure that the log Trace Level is set to DebugHigh:

    1. On the server where the Integration Service is installed, go to <install software dir>\ContactStore\LogManager.exe.

    2. Run the Log Manager.

    3. Select the IntegrationService component and set Trace Level to DebugHigh.

  2. Go to <datadir>/logs and open the Integration Service log file.

  3. Locate the CTI event in question.

    Events from the integration target a destination of “CallTracker” within the system. To find CallTracker events, filter the log for lines that look like:

    --> <CallTracker>

    If there are multiple adapters configured in the system, the source information (for example, the “si.1” field from the <si.1> --> <CallTracker> log line) can be used for additional filtering.

  4. Locate the desired data from within the message.

    All data within a message is held within a named Field. Each Field is tracked within either a Folder or an Array. To extract data from a Field, the entire path to that Field must be defined.

    The names of fields, folders, and arrays are case-sensitive when defining a mapping.

Example 1: CTI events

The following is an example CTI event from Adapter 2 sent into the CallTracker for processing. In this case, the customer wants to extract the call id and the calling party display name.

Copy
Dispatching Event CTI Event<si.2> --> <CallTracker> Size<2>Int<AdapterId> = 2 ; Str<AdapterName> = JTAPI ; Int<SwitchId> = 304 ; Str<SwitchName> = Cisco ; Int<eventId> = 116
Str<description> = TermConnCreatedEv SEP68BDABA4568B
Folder<event>
Int<ciscoCause> = 100 ; Str<ciscoCauseStr> = CAUSE_INVALIDIECONTENTS ; Int<ciscoFeatureReason> = 12 ; Str<ciscoFeatureReasonStr> = REASON_NORMAL
Int<callId> = 16865573
Folder<ciscoCallIdentifiers>
Int<ciscoCallId> = 16865573 ; Int<ciscoCallManagerId> = 1 ; Int<ciscoGlobalCallId> = 88357
Folder<calledPartyInfo>
Str<displayName> =  ; Str<unicodeDisplayName> =
Folder<callingPartyInfo>
Str<address> = 8614 ; Str<displayName> = 8614 SCCP Tier3 DMS ; Str<unicodeDisplayName> = 8614 SCCP Tier3 DMS
Folder<terminalConnection>
Int<termConnState> = 67 ; Int<callControlTermState> = 98 ; Int<connState> = 51 ; Int<callControlState> = 84 ; Str<terminalAddress> = 8614/SEP68BDABA4568B
Array<connections>  [1]
[0]: Str<terminalAddress> = 8614/SEP68BDABA4568B ; Int<callControlState> = 84 ; Int<termConnState> = 67 ; Int<connState> = 51 ; Int<callControlTermState> = 98

In the CTI Event example, the following fields were identified for extraction:

On Line 7: Int<ciscoCallId> = 16865573

On Line 11: ; Str<unicodeDisplayName> = 8614 SCCP Tier3 DMS

  • Identify the full path to the ciscoCallId field. To find the path, work up from the ciscoCallId field and identify all of the folders and arrays above it. In the example, the ciscoCallId field is within the ciscoCallIdentifiers folder, which is contained within the event folder. There is no folder above the event folder. So, to access this field, the mapping is event.ciscoCallIdentifiers.ciscoCallId.

  • Identify the full path to the unicodeDisplayName field. To find the path, work up from the unicodeDisplayName field and identify all of the folders and arrays above it. unicodeDisplayName is within a folder named callingPartyInfo, which is within the event folder. To extract this name, the mapping is event.callingPartyInfo.unicodeDisplayName.

Example 2: CTI events in unknown array index Repository of transcribed interactions, which are used for analysis in Speech Analytics.

The following CTI event from Verint Adapter 2 was sent to the CallTracker service for processing. In this case, our customer wants to identify the agent and the customer in a call. Although there are several tags Time-stamped information items appended to interactions at different points of interest, including Annotations and Events. that could be used, the agent's email address and the customer's telephone number offer unique values.

Copy
[IEMessage |295C|H] 2024-07-17 13:23:30.261-04:00  Dispatching <Event> CTIEvent<si.2> --> <CallTracker> Size<0>
  Int<AdapterId> = 2 ; Str<AdapterName> = Genesys Cloud CX API Adapter ; Int<SwitchId> = 201 ; Str<SwitchName> = Genesys_TenantB_QA ; Str<MonitoredDevice> = Agent01@myContactCenter.com ; Str<version> = 2
  Str<topicName> = v2.users.443c901d-5406-405d-8ca3-f0041da44613.conversations
  Folder<eventBody>
    Str<id> = 51123a71-1f50-490d-b79c-ab18f506b755 ; Str<recordingState> = active ; Str<address> = tel:+18881231234 ; Str<utilizationLabelId> = 631f0939-be32-495a-baf9-970abb039192 ; Bool<securePause> = false
    Array<participants>  [4]
      [0]: Folder<attributes>
      [0]: Str<id> = b4434aed-a6ff-458c-b6b7-79312041e850 ; Str<connectedTime> = 2024-07-17T17:23:11.103Z ; Str<endTime> = 2024-07-17T17:23:24.976Z ; Str<name> = Agent01 call flow ; Str<purpose> = ivr ; Bool<wrapupRequired> = false
      [0]: Str<address> = sip:a1b8db7d-9e3d-4dbd-a8b2-47d3eeef1630@127.0.0.1;language=en-US;user=ivr ; Bool<wrapupExpected> = false
      [0]: Array<calls>  [1]
      [0]:   [0]: Str<id> = 652d297b-1cc1-475d-85e1-436c3675f634 ; Str<state> = terminated ; Str<initialState> = offering ; Bool<recording> = false ; Str<recordingState> = none ; Bool<muted> = false ; Bool<confined> = false ; Bool<held> = false
      [0]:   [0]: Bool<securePause> = false ; Str<disconnectType> = transfer ; Str<direction> = inbound ; Str<provider> = Edge ; Str<peerId> = 517bc150-72d9-4359-9118-e4e0360c3dfe ; Str<connectedTime> = 2024-07-17T17:23:11.103Z
      [0]:   [0]: Str<disconnectedTime> = 2024-07-17T17:23:24.976Z ; Bool<afterCallWorkRequired> = false
      [0]:   [0]: Folder<self>
      [0]:   [0]:   Str<name> = Hasbrouck Heights NJ ; Str<nameRaw> = Hasbrouck Heights NJ ; Str<addressNormalized> = sip:a1b8db7d-9e3d-4dbd-a8b2-47d3eeef1630@127.0.0.1;language=en-US;user=ivr ; Str<addressDisplayable> = unavailable
      [0]:   [0]:   Str<addressRaw> = sip:a1b8db7d-9e3d-4dbd-a8b2-47d3eeef1630@127.0.0.1;language=en-US;user=ivr
      [0]:   [0]: Folder<other>
      [0]:   [0]:   Str<name> = Robert Smith ; Str<nameRaw> = Robert Smith ; Str<addressNormalized> = tel:+15551231234 ; Str<addressRaw> = sip:+15551231234@10.87.6.151;user=phone ; Str<addressDisplayable> = unavailable
      [0]: Folder<workflow>
      [0]:   Str<workflowId> = 44f92b9f-0524-469c-805d-58924c24feef
      [1]: Folder<attributes>
      [1]: Str<id> = 01d6aa4d-8259-4373-be8b-4f8eac6b27f4 ; Str<connectedTime> = 2024-07-17T17:23:11.280Z ; Str<externalContactId> = 7287af43-0211-4652-9caa-d989c7b1a3f7 ; Str<name> = Robert Smith ; Str<purpose> = customer
      [1]: Str<queueId> = 25d389d7-30ac-46d0-8284-432acf0c7b4a ; Str<address> = tel:+15551231234 ; Bool<wrapupRequired> = false ; Bool<wrapupExpected> = false
      [1]: Array<mediaRoles>  [1]
      [1]:   [0]: Str<mediaRoles> = full
      [1]: Array<calls>  [1]
      [1]:   [0]: Str<id> = 517bc150-72d9-4359-9118-e4e0360c3dfe ; Str<state> = connected ; Str<initialState> = offering ; Bool<recording> = true ; Str<recordingState> = active ; Bool<muted> = false ; Bool<confined> = false ; Bool<held> = false
      [1]:   [0]: Bool<securePause> = false ; Str<direction> = inbound ; Str<provider> = Edge ; Str<connectedTime> = 2024-07-17T17:23:11.280Z ; Bool<afterCallWorkRequired> = false
      [1]:   [0]: Folder<self>
      [1]:   [0]:   Str<name> = Robert Smith ; Str<nameRaw> =  ; Str<addressNormalized> = tel:+15551231234 ; Str<addressRaw> = sip:+15551231234@10.87.225.68 ; Str<addressDisplayable> = unavailable
      [1]:   [0]: Folder<other>
      [1]:   [0]:   Str<name> = Hasbrouck Heights NJ ; Str<nameRaw> =  ; Str<addressNormalized> = tel:+18881231234 ; Str<addressRaw> = sip:+18881231234@10.87.6.151:8140;transport=tcp ; Str<addressDisplayable> = unavailable
      [2]: Folder<attributes>
      [2]: Str<id> = 88365632-9039-4a32-acbe-26ef398cbbbd ; Str<connectedTime> = 2024-07-17T17:23:25.032Z ; Str<name> = Agent01 queue ; Str<queueId> = 25d389d7-30ac-46d0-8284-432acf0c7b4a ; Str<purpose> = acd ; Bool<wrapupRequired> = false
      [2]: Str<address> = sip:25d389d7-30ac-46d0-8284-432acf0c7b4a@127.0.0.1;language=en-US;user=acd ; Bool<wrapupExpected> = false
      [2]: Folder<conversationRoutingData>
      [2]:   Folder<language>
      [2]:   Byte<priority> = 0
      [2]:   Folder<queue>
      [2]:     Str<id> = 25d389d7-30ac-46d0-8284-432acf0c7b4a
      [2]: Array<calls>  [1]
      [2]:   [0]: Str<id> = 8a62f071-98cb-48c3-aa5f-9b917a597af1 ; Str<state> = connected ; Str<initialState> = offering ; Bool<recording> = false ; Str<recordingState> = none ; Bool<muted> = false ; Bool<confined> = false ; Bool<held> = false
      [2]:   [0]: Bool<securePause> = false ; Str<direction> = inbound ; Str<provider> = Edge ; Str<peerId> = 517bc150-72d9-4359-9118-e4e0360c3dfe ; Str<connectedTime> = 2024-07-17T17:23:25.032Z ; Bool<afterCallWorkRequired> = false
      [2]:   [0]: Folder<self>
      [2]:   [0]:   Str<name> = Agent01 queue ; Str<nameRaw> = Agent01 queue ; Str<addressNormalized> = sip:25d389d7-30ac-46d0-8284-432acf0c7b4a@127.0.0.1;language=en-US;user=acd ; Str<addressDisplayable> = unavailable
      [2]:   [0]:   Str<addressRaw> = sip:25d389d7-30ac-46d0-8284-432acf0c7b4a@127.0.0.1;language=en-US;user=acd
      [2]:   [0]: Folder<other>
      [2]:   [0]:   Str<name> = Robert Smith ; Str<nameRaw> = Robert Smith ; Str<addressNormalized> = tel:+15551231234 ; Str<addressRaw> = sip:+15551231234@10.87.6.151;user=phone ; Str<addressDisplayable> = unavailable
      [3]: Folder<attributes>
      [3]: Str<id> = 92a2c0a1-575d-4ba7-8bf1-9b4da987cfb9 ; Str<userId> = 443c901d-5406-405d-8ca3-f0041da44613 ; Str<queueId> = 25d389d7-30ac-46d0-8284-432acf0c7b4a ; Str<purpose> = agent ; Bool<wrapupRequired> = false ; Bool<wrapupExpected> = true
      [3]: Str<address> = sip:62d0249013bd2d1d8f86bf1f+mycontactcenterBYOC.orgspan.com;tgrp=6a5d2b81-ba49-42f7-bbdd-c6aecda5af17;trunk-context=mycontactcenterBYOC@localhost ; Str<wrapupPrompt> = optional ; Shrt<alertingTimeoutMs> = 8000
      [3]: Str<device> = Agent01@myContactCenter.com
      [3]: Array<mediaRoles>  [1]
      [3]:   [0]: Str<mediaRoles> = full
      [3]: Array<calls>  [1]
      [3]:   [0]: Str<id> = ebdb1e0b-442a-4131-8f91-eaee94e79cbe ; Str<state> = alerting ; Str<initialState> = alerting ; Bool<recording> = false ; Str<recordingState> = none ; Bool<muted> = false ; Bool<confined> = false ; Bool<held> = false
      [3]:   [0]: Bool<securePause> = false ; Str<direction> = inbound ; Str<provider> = Edge ; Str<peerId> = 517bc150-72d9-4359-9118-e4e0360c3dfe ; Bool<afterCallWorkRequired> = false
      [3]:   [0]: Folder<self>
      [3]:   [0]:   Str<nameRaw> = Agent01@myContactCenter.com ; Str<addressNormalized> = sip:62d0249013bd2d1d8f86bf1f+mycontactcenterBYOC.orgspan.com;tgrp=6a5d2b81-ba49-42f7-bbdd-c6aecda5af17;trunk-context=mycontactcenterBYOC@localhost ; Str<addressDisplayable> = unavailable
      [3]:   [0]:   Str<addressRaw> = sip:62d0249013bd2d1d8f86bf1f+mycontactcenterBYOC.orgspan.com@10.87.6.151;language=en-US;user=station
      [3]:   [0]: Folder<other>
      [3]:   [0]:   Str<name> = Robert Smith ; Str<nameRaw> = Robert Smith ; Str<addressNormalized> = sip:+15551231234@10.87.6.151;user=phone ; Str<addressRaw> = sip:+15551231234@10.87.6.151;user=phone
      [3]:   [0]:   Str<addressDisplayable> = unavailable
      [3]:   [0]: Folder<queueMediaSettings>
      [3]:   [0]:   Byte<alertingTimeoutSeconds> = 8
      Array<recentTransfers>  [1]
      [0]: Folder<initiator>
      [0]: Folder<modifiedBy>
      [0]: Str<id> = b44b6635-bbff-4b57-92e7-c66df8180561 ; Str<state> = active ; Str<dateIssued> = 2024-07-17T17:23:25.267Z ; Str<transferType> = attended
      [0]: Folder<destination>
      [0]:   Str<userId> = 443c901d-5406-405d-8ca3-f0041da44613 ; Str<address> = sip:tuananh.pham(missing param)0verint.com@localhost
  Folder<metadata>
    Str<CorrelationId> = cd31f7ab-275d-4c38-b69d-156f4f5212f5

To get a mapping, identify the full path to the required data. To find the path, work up from the required field and identify all of the folders and arrays above it.

In the CTI event, the required data is the customer's phone number, which is found within the path:

Line 4: Folder<eventBody>

Line 6: Array<participants>

Line 22: Str<purpose> = customer

Line 23: Str<address> = tel:+15551231234

The agent's email address is within:

Line 4: Folder<eventBody>

Line 6: Array<participants>

Line 50: Str<purpose> = agent

Line 52: Str<device> = Agent01@myContactCenter.com

For this external system, we cannot predict in which array index (0, 1, 2, etc.) the customer and agent participants might be found. For this reason we use the Selector option, which provides a more flexible method to tag a data value within an array.  The format to use is:

FolderName.arrayName(selector:PropertyName=PropertyValue).DesiredValue.

To map the desired values on the adapter, use the following mappings:

  • eventBody.participants(selector:purpose=customer).address

  • eventBody.participants(selector:purpose=agent).device

Example 3: SIPREC events

This is an example SIPREC recording event from the internal SIP Proxy sent into the CallTracker for processing. In this case, the customer wants to extract the UCID and the second participant name.

Copy
Dispatching Event recording<SIPProxy> --> <CallTracker> Size<0>Int<AdapterId> = 1 ; Str<AdapterName> = SIPREC SBC Avaya ; Int<SwitchId> = 751 ; Str<SwitchName> = SIPREC_SBC ; Str<datamode> = complete
Str<rSessionId> = 786562_54473663@xx.xx.254.70
Array<group>  [1]
[0]: Str<group_id> = OGM3MTkzMDAtMThiNy0xMA== ; Str<associate-time> = 2017-05-11T20:37:18Z
[0]: Folder<callData>
[0]:   Str<fromhdr> = sip:+114045555678@xx.xx.138.36:5060;user=phone ; Str<callid> = 1258564145_113685498@xx.xx.135.12 ; Str<gcid> = 786562
[0]:   Str<tohdr> = "UUID-00FA080045C69E5914CB7E" <sip:+18885551234@xx.xx.135.71;user=phone>;tag=gK0c80b638
Array<session>  [1]
[0]: Str<session_id> = OGM3MTkzMDEtMThiNy0xMA== ; Str<group-ref> = OGM3MTkzMDAtMThiNy0xMA== ; Str<start-time> = 2017-05-11T20:37:18Z
[0]: Str<avayaUCID> = 00FA080045C69E5914CB7E
Array<participant>  [2]
[0]: Str<participant_id> = OGM3MTkzMDItMThiNy0xMA==
[0]: Folder<nameID>
[0]:   Str<aor> = +18885551234@xx.xx.138.36:5060
[0]: Folder<name>
[0]:   Str<lang> = en
[1]: Str<participant_id> = OGM3MTkzMDMtMThiNy0xMA==
[1]: Folder<nameID>
[1]:   Str<aor> = +14045555678@xx.xx.135.71
[1]: Folder<name>
[1]:   Str<lang> = en
Array<stream>  [2]
[0]: Str<stream_id> = OGM3MTkzMDQtMThiNy0xMA== ; Str<session_id> = OGM3MTkzMDEtMThiNy0xMA== ; Str<associate-time> = 2017-05-11T20:37:18Z
[0]: Array<label>  [1]
[0]:   [0]: Str<label> = 1
[1]: Str<stream_id> = OGM3MTkzMDUtMThiNy0xMA== ; Str<session_id> = OGM3MTkzMDEtMThiNy0xMA== ; Str<associate-time> = 2017-05-11T20:37:18Z
[1]: Array<label>  [1]
[1]:   [0]: Str<label> = 2

In the SIPREC event example, the following fields were identified for extraction:

On Line 10: [0]: Str<avayaUCID> = 00FA080045C69E5914CB7E

On Line 19 : [1]:   Str<aor> = +14045555678@xx.xx.135.71

  • avayaUCID” field. Working up from the “avayaUCID” field, we need to identify all of the folders /arrays above it. In this particular example message, the “avayaUCID” field exists in the “session” array. There is no folder above the “session” array in this example. The formatting of the Array tells us there is one (1) entry in the array (that is “Array<session> [1]”) and the desired field is in the zeroth index of the array (that is “[0]: Str<avayaUCID>”). To access this field, the mapping would be “session(0).avayaUCID”.

  • aor” field. Extracting the display name is done in a similar manner. The “aor” field is held within a folder named “nameID”, which is contained within a different array named “participant”. To extract this name, the mapping is “participant(1).nameID.aor”.

CTI tagging

Create Custom Data fields

Map Custom Data to an attribute

Map attributes to an adapter