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
Callcall
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> |
Expand | title |
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)
Result: 1 | ||||
Expand | ||||
| ||||
title | Add to DNCR (blacklist)
Code Block | camptoreschedule (optional - dialer to reschedule the call)extension tag(incoming extension of the flow)( text for tag or empty by defaultjsonparams (JSON Object) l1|l2|l3 ) Result:OK | ||
Expand | ||||
1 |
External Workflow call
Info |
---|
Add number Allows to Do not call Registry (black list) by campaign or use * on campaign for allcall 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"
"expire_date": "2025-01-01",
"direction": "I/O",
} |
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/ addblackdeleteblackbulk Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8 Params: array de blacklistblack (JSON ObjectArray) Result:1 Json object
|
1 |
Recordings
Here you will find how to use recordings with the API
expand.
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 |
Expand |
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. Expand
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;
} |
Expand | title |
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> |
Expand | title |
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) |
Expand | title |
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
}
} |