Here, we can find all the information relevant to the telephony actions that can be performed through our API.
Calls
With the calls we can find the following available actions
Make call
Code Block |
---|
Relative URL: Integra/resources/Agents/AgentCall Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: callerid (From number that the call will go out with) agent (Name of the Agent that generates the call) phone (Phone of the Agent that generates the call) tech (Usually SIP) context (Context of the Agent configured in uContact) outqueue (Name of the Outbound Campaign to compute the call) destination (Destination number) Result: TEXT (Guid of the generated call) 0 if Error This is a two step call will call the agent and when answer (or auto answer), the final call it is generated. |
via Proxy
Code Block |
---|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function Call () { var windowProxy; windowProxy.addEventListener(onResponse); windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'call', 'campaign' : '<CAMPAIGN>', 'callerid' : '<CALLERID>', 'destination' : '<NUMBER>'}); } function onResponse(messageEvent) { response = messageEvent.data.guid; //returns uniqueid of the call } </script> |
Make call by phone
Info |
---|
This function allows you to make a call directly using the portal's phone. The only way to use it is via proxy, because the communication is with the uContact portal. |
Code Block |
---|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script> function call(){ var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + '//' + window.location.hostname); windowProxy.addEventListener(onResponse); windowProxy.post({ action: 'callWithPhone', destination: '091000000', campaign: 'Sale->' }); } function onResponse(messageEvent) { var response = messageEvent.data.guid; alert(response); } </script> |
HungUp Call
Code Block |
---|
Relative URL: Integra/resources/Agents/HungupPhone Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: phone (Phone of the Agent that generates the call) Result: 1 Success on hung up 0 if Error |
via Proxy
Code Block |
---|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> //for example on click when you want to hangup function Hangup () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'hangup'}); } </script> |
Disposition Call
Info |
---|
Disposition of the call using dialer actions and taging
Dispositions must be configured in uContact. |
Code Block |
---|
Relative URL: Integra/resources/api/DispositionCall Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: campaign (campaign name) agent (agent name) callerid (customer phone number) guid (call id) l1 (level 1 disposition) l2 (level 2 disposition) l3 (level 3 disposition) d1 (extra data) d2 (extra data) comment (comment) schedule (if action RESCHEDULE will schedule a call in the future for that number) camptoreschedule (optional - dialer to reschedule the call) tag ( text for tag or empty by default l1|l2|l3 ) Result: 1 |
External Workflow call
Info |
---|
Allows to call a web service that injects information into a voice dialplan allowing multiple actions by workflows. |
Code Block |
---|
Relative URL: Integra/resources/admin/CallWorkflow Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: context (incoming context of the flow) extension (incoming extension of the flow) jsonparams (JSON Object) Result: OK |
Blacklist
Blacklist Object
Code Block |
---|
{ "phone": "12341234", "campaign": "Campaign", "username": "username", "company": "Company name", "job_title": "Developer", "name": "Name" } |
Info |
---|
|
Add a number to the Blacklist
Code Block |
---|
Relative URL: Integra/resources/admin/addblack Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: blacklist object (JSON Object) Result: 1 |
Add multiple numbers to the Blacklist
Code Block |
---|
Relative URL: Integra/resources/admin/addblackbulk Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: array de blacklist (JSON Array) Result: 1 |
Remove number from the Blacklist
Code Block |
---|
Relative URL: Integra/resources/admin/deleteblack Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: objeto blacklist (JSON Object) Result: 1 |
Remove multiple numbers from the Blacklist
Code Block |
---|
Relative URL: Integra/resources/admin/deleteblackbulk Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: array de blacklist (JSON Array) Result: 1 |
Recordings
Here you will find how to use recordings with the API.
Get Recordings
Code Block |
---|
Relative URL: Integra/resources/Cdr/getrecords Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: lastrow (Last number of records for pagination, example 0 (will get you 50 recordings from 0-50), 50 (will get from 51-100)) if search limit is 50 searchLimit records count filter (Json of the filter object) Random: 1 (Always 1) Result: JSON |
Json Object
Code Block |
---|
{ "calldatei": "2015-12-03 00:00:00", //Initial date "calldatef": "2016-02-24 23:59:59", //Final date "agent": "", //Agent "campaign": "", //Campaign "source": "", //Source "destination": "", //Destination "data": "", //Data of the call Tag "range": "", //Hour range "rating": "", //Qualification "mindur": "", //Min duration "exclude": "", //Exclude number "type": "record" //Type of record alway the same ,"cont": "" //How many times at least we have this number in the range } |
The recording could be in 4 different places:
Code Block |
---|
https://TelephonyIP/records/guid.mp3 https://TelephonyIP/records/guid.mp3 https://BackupRecords/records/20160118/guid.mp3 https://BackupRecords/records/guid.mp3 Guid (Unique identifier found in JSON) Example: 7e4e7db9-f080-494e-b04b-7c8e47711558 |
Note |
---|
The folders are the date of the recording that is on the JSON string (calldate) without hypens or time. This is done because if you are storing many million files the Operating System won't be able to manage them ok, that is why we store the recording per day in folders. |
Warning |
---|
If you don't find the recording on any of these places the recording could be in GSM format, you can do 2 things here:
|
Convert Recordings
Code Block |
---|
Relative URL: Integra/resources/Supervisor/convert Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: guid (Unique identifier of the recording) folder (Example:20160118) This is the date of the recording in case the recording is found there. Result: 1 for complete. |
Info |
---|
Then you will try again to find the MP3 file (you can reproduce the URL with HTML5 or any capable audio player). |
Code Block |
---|
https://TelephonyIP/records/guid.mp3 https://TelephonyIP/records/guid.mp3 https://BackupRecords/records/20160118/guid.mp3 https://BackupRecords/records/guid.mp3 Guid (Unique identifier found in JSON) Example: 7e4e7db9-f080-494e-b04b-7c8e47711558 |
Tag Record
Code Block |
---|
Relative URL: Integra/resources/Agents/TagRecord Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: phone (Destination phone) guid (Record unique identifier) data (Text to tag) Result: Empty, is an Async Request |
Via Proxy
Code Block |
---|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> //for example on click when you want to close a tab function CloseTab () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'tag', 'guid' : '<GUID>', 'message' : '<MESSAGE>'}); } </script> |
Dialers
Here we see some actions that we use only for voice markers.
CTI
This JSON object is found on LocalStorage and encrypted, this has the information of the Answered Call and if is From a Dialer all the information of the Next alternative phone to Respool.
Dialer: Campaign, Main number, status(always 1), data (params and values for the workflow), alternatives (with :), retries (for this main number), contact (id), dialebase, priority, agentphone
Convert this datas to the Objet Respool shown below.
What can we do with Objet Respool?:
Change main number and alternatives and reorder them
Change retries for the main number (example if we use an alternative number as main then we set retries to 0)
Change priorities
Add data or change them for the workflow
agentphone, if progressive we can assign it to other agent
DON'T CHANGE: campaign, status, contact, dialerbase: Can alter the dialer beheavior.
via Proxy
Code Block |
---|
windowProxy = new Porthole.WindowProxy('<URL PARENT>'); windowProxy.addEventListener(onMessage); windowProxy.post({'action': 'CTI'}); function onMessage(messageEvent) { CTI = messageEvent.data.CTI; } |
Respool Call
Code Block |
---|
Relative URL: Integra/resources/Dialers/Respool Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: callspool (JSON Object) Result: 1 |
Json object
Code Block |
---|
{ "campaign": "Ventas->", //Name of the campaign "destination": "098344484", //Destination number "dialerbase": "basetest", //Name of the dialer List "status": 1, // 1 if enable "data": "Par1=Val1:Par2=Val2", // Params for the workflow and Forms "alternatives": "098124484", //Alternatives numbers separated by : "contact": 222, // Contactid "retries": 0, // 0 as we are starting a new phone "priority": 9999, // Priority to order the records 1 is used for schedule so use > 1 "agentphone": "1001" // For progressive dialers } |
Warning |
---|
Never Respool a destination that is already on the Spool always a alternative number, in CTI the principal number is already the first alternative. |
via Proxy
Code Block |
---|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function Respool () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'respool', 'objetoRespool' : <Objeto Respool>}); } </script> |
Schedule Call
Warning |
---|
The dialer has to be Enable and On Date To process Schedule Calls if not this will be the first to go out when the Dialer starts again. |
Code Block |
---|
Relative URL: Integra/resources/Dialers/ScheduleDialerCall Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: callschedule (JSON Object) Result: 1 OK 0 ERROR |
Json Object
Code Block |
---|
{ "calldate" : "2015-10-11 15:00:00", //Calldate to be executed "campaign" : "Ventas->", //Dialer campaign "destination" : "098344484", //Destination for the call "alternatives" : "099124484:099121212", //Alternative phones "agentphone" : "1001", //Agent phone if progressive "data" : "Par1=Val1:Par2=Val2" //Values for Forms and Workflows } |
via Proxy
Code Block |
---|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function Schedule () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'schedule', 'callDate' : '<2016-10-10 15:00:00>', 'objectDialer' : <Objecto Respool> }); } </script> |
Dialer Tasks
Info |
---|
If the call date is specified, the task will execute at this exact moment, on the contrary, if the date is specified as null, the task will execute when the schedule is free. The priority of the scheduled task with an specific date will be higher than the one that date is null. |
Code Block |
---|
Dialer Task URL Relativa: Integra/resources/Dialers/DialerTask Método: POST content-type: application/x-www-form-urlencoded Parámetros: call (Objeto JSON) Resultado: 1 OK 0 ERROR |
Examples for each mode
Insert Dialer with priority 1
Info |
---|
"calldate" is NOW
|
Code Block |
---|
{"calldate" : null, "campaign" : "campName<-", "destination": "12-345-678", "alternatives": "", "agent" : "", "data": "idcustomer=7", "source": "source", "bulk": false, "automatic": true } |
Create a manual call -Click to call-
Info |
---|
make a call in the moment |
Code Block |
---|
{"calldate" : null, "campaign" : "campName<-", "destination": "12-345-678", "alternatives": "", "agent" : "", "data": "idcustomer=7", "source": "source", "bulk" : false, "automatic" : false } |
Insert Scheduled Call for anytime
Info |
---|
Calldate is any future date time |
Code Block |
---|
Dialer, Any Time {"calldate" : "2020-01-01 00:00:00", "campaign" : "campName<-", "destination": "12-345-678", "alternatives": "", "agent" : "", "data": "idcustomer=7", "source": "source", "bulk" : true, "automatic" : false } |
Insert Dialer call to a Dialer
Info |
---|
If dialer is progressive, don’t forget to insert the agent |
Code Block |
---|
Dialer, Specific Agent //Identify Agent by its username: {"calldate" : null, "campaign" : "campName->", "destination": "12-345-678", "alternatives": "", "agent" : "Agent1", "data": "idcustomer=7", "source": "source", "bulk" : true, "automatic" : false} //Identify Agent by its assigned phone number: {"calldate" : null, "campaign" : "campName->", "destination": "12-345-678", "alternatives": "", "agent" : "1001", "data": "idcustomer=7", "source": "source", "bulk" : true, "automatic" : false} |
Delete Contact from Dialer
Code Block |
---|
Relative URL: Integra/resources/Dialers/RemoveContact Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: campaign number Result: 1 |
Delete Schedule from Dialer
Info |
---|
Deletes a schedule call, parameters campaign, number,date from and to format: (YYYY-MM-DD HH:mm:ss) to be able to delete in a date time range. |
Code Block |
---|
Relative URL: Integra/resources/Dialers/RemoveScheduleDialerCall Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: campaign destination from to Result: 1 |
Upload Bases
The API gives us the possibility to upload the lists of dialers in a simple way, with parameters and with timezone so that it is used the most appropriate to your needs.
Upload Calls Base
Code Block |
---|
Relative URL: Integra/resources/Dialers/uploadbase Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: filename (Name of the file) fileb64 (base64 content of the file) campaign (Name of the campaign) cant (Count of records) username (user uploading) Result: 1 (Async Method) |
File Format
Code Block |
---|
prueba1;098344484;var1=val1:var2=val2;099124484:099111111;9999;1001 campaign;principanumber;parameters and values for workflows and forms;alternatives phones separated by :; priority (optional);agentphone (optional) |
Upload Calls Base with Timezone
Code Block |
---|
Relative URL: Integra/resources/Dialers/uploadbasewithtimezone Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: filename (Name of the file) fileb64 (base64 content of the file) campaign (Name of the campaign) cant (Count of records) username (user uploading) timezone (Timezone, the list of zones can be found in: uContact Timezones) Result: 1 (Async Method) |
File format
Code Block |
---|
prueba1;098344484;var1=val1:var2=val2;099124484:099111111;9999;1001 campaign;principanumber;parameters and values for workflows and forms;alternatives phones separated by :; priority (optional);agentphone (optional) |
Campaigns Information
You can also get voice campaign information through the API.
Campaigns Summary
To see the status of system campaigns summarized, the following method exists
Code Block |
---|
Relative URL: Integra/resources/Supervisor/queuesummary Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Result: JSON |
Response
Code Block | ||
---|---|---|
| ||
[ { "queue": "Power<-", "loggedIn": 10, "available": 5, "callers": 3, "holdTime": 18, "talkTime": 130, "longestHoldTime": 220, "internalActionId": "1982468278_6312", "dateReceived": "Nov 2, 2018 11:31:42 AM" }, { "queue": "test->", "loggedIn": 0, "available": 0, "callers": 0, "holdTime": 0, "talkTime": 0, "longestHoldTime": 0, "internalActionId": "1982468278_6312", "dateReceived": "Nov 2, 2018 11:31:42 AM" }, { "internalActionId": "1982468278_6312", "dateReceived": "Nov 2, 2018 11:31:42 AM" } ] |
Campaign Status
On the other hand, if we want to obtain all the information of the campaigns of the system, we can use this other method
Code Block |
---|
Relative URL: Integra/resources/Supervisor/campaignstatus Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: queue (Example: CampTest2<-) Result: JSON (Has different type of Objects, Campaigns, Agents and ACD Calls) |
Response
Code Block |
---|
{ "Power<-": { "campaign": "Power<-", "availables": 0, "notavailables": 1, "paused": 0, "busy": 0, "busypaused": 0, "totalagents": 1, "logged": 0, "onwrapup": 0, "completed": 0, "abandoned": 0, "talked": "00:00:00-0", "hold": "00:00:00-0", "abandonedlevel": "0", "totalcalls": 0, "acd": 0, "servicelevel": "0.0", "servicelevel2": "0.0", "strategy": "leastrecent", "slevelthreshold": "3", "wrapup": 0 }, "test->": { "campaign": "test->", "availables": 0, "notavailables": 0, "paused": 0, "busy": 0, "busypaused": 0, "totalagents": 0, "logged": 0, "onwrapup": 0, "completed": 0, "abandoned": 0, "talked": "00:00:00-0", "hold": "00:00:00-0", "abandonedlevel": "0", "totalcalls": 0, "acd": 0, "servicelevel": "0.0", "servicelevel2": "0.0", "strategy": "leastrecent", "slevelthreshold": "3", "wrapup": 3 } } |