V 2.0

Analysis

Overview

The Analysis API is designed to manage and monitor call counters. It ensures that every incoming call is counted and incremented accordingly, providing real-time insights into call activities.

Key Concepts:

  1. Call Counters:

    • When a call enters the system, a counter is incremented to represent the event.

    • This data is categorized based on various parameters such as type (inbound, outbound), campaign, agent, etc.

  2. Hits Counters:

    • When a call is received by an agent, the system increments the counter on behalf of the agent.

    • This provides granular tracking of call interactions at the agent level.

By aggregating these counters, the API delivers detailed analytics on call activities, enabling businesses to monitor performance effectively.


Error Codes

Error Code Message Description
1000 Invalid parameter One or more request parameters are invalid.
1001 Invalid data type The data type of a parameter is incorrect.
1002 UserId not provided The userId parameter is missing.
1010 Error in DB connect Database connection error occurred.
1015 Permission denied User does not have permission to access this API.
1043 Agent is not logged in The agent is not currently logged in.
1501 Connection issue Could not connect to the backend system.
1586 Data not found No data available for the provided parameters.

Hits Analysis

{{brand}}/api/v2/analysis/hits

Endpoint

Description: The /hits/ endpoint provides detailed information on counters at the agent level. When a call is assigned to or answered by an agent, the corresponding counter is incremented. This endpoint is used to analyze individual agent performance or call distribution across agents.

Request Parameters

Parameter Type Required Description
ssid String Optional Session ID for the user's session.
userId String Yes Unique identifier for the user.
token String Yes Authorization token.
filter Array No Array of filter conditions (e.g., date range, call type).
extra Array No Additional filter criteria (e.g., specific agents or call types).
breakDown String No Field to break down data (e.g., agentId, callType). Default: agentId.
disPlay String No Field to display aggregation (e.g., date, callType). Default: date.
fields Array No Fields for aggregation. Refer to the fields table.
multi Boolean No Whether to enable multi-level aggregation. Default: false.

Response

Field Description
data Object containing granular call data for agents.
status Status of the operation (success or error).
code HTTP status code.

Fields and Descriptions

Field Description
UC Unique Call
TC Approached Call
MC Missed Counts
AC Answered Count
CM Completely Missed
PM Partially Missed
CA Completely Answered
FR_CAN_FR_PM_N Retried and Answered Count Description
GH_UC Ghost Calls Unique
FR_UC FailOver Retry Unique Call
FR_CM FailOver Retry Completely Missed
FR_PM FailOver Retry Partially Missed
FR_CA FailOver Retry Completely Answered
avgRingTime Average Ring Time
avgHoldTime Average Hold Time

Hits Analysis

var axios = require('axios');
var data = '{ "ssid":"{{ssid}}", "fileds":["TH"],"filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]}';

var config = {
 method: 'post',
 url: '{{brand}}/api/v2/analysis/hits',
 headers: { 
'Content-Length': ''
 },
 data : data
};

axios(config)
.then(function (response) {
 console.log(JSON.stringify(response.data));
})
.catch(function (error) {
 console.log(error);
});
setUrl('{{brand}}/api/v2/analysis/hits');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
 'follow_redirects' => TRUE
));
$request->setHeader(array(
 'Content-Length' => ''
));
$request->setBody('{ "ssid":"{{ssid}}", "fileds":["TH"],"filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]}');
try {
 $response = $request->send();
 if ($response->getStatus() == 200) {
echo $response->getBody();
 }
 else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
 }
}
catch(HTTP_Request2_Exception $e) {
 echo 'Error: ' . $e->getMessage();
}
import http.client

conn = http.client.HTTPSConnection("{{brand}}")
payload = "{ \"ssid\":\"{{ssid}}\", \"fileds\":[\"TH\"],\"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]}"
headers = {
 'Content-Length': ''
}
conn.request("POST", "/api/v2/analysis/hits", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
var client = new RestClient("{{brand}}/api/v2/analysis/hits");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
var body = @"{" + "\n" +
@"     ""ssid"":""{{ssid}}""," + "\n" +
@"     ""fileds"":[""TH""]," + "\n" +
@"    ""filter"":[{""key"":""date"",""condi"":""range"",""val"":""11 18 2024 00:00:00,11 18 2024 23:59:59""}]" + "\n" +
@"}";
request.AddParameter("text/plain", body,  ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
curl --location -g --request POST '{{brand}}/api/v2/analysis/hits' \
--data-raw '{
     "ssid":"{{ssid}}",
     "fileds":["TH"],
    "filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]
}'
var request = http.Request('POST', Uri.parse('{{brand}}/api/v2/analysis/hits'));
request.body = '''{\n     "ssid":"{{ssid}}",\n     "fileds":["TH"],\n    "filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]\n}''';

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
   print(await response.stream.bytesToString());
}
else {
   print(response.reasonPhrase);
}
package main

import (
   "fmt"
   "strings"
   "net/http"
   "io/ioutil"
)

func main() {

   url := "%7B%7Bbrand%7D%7D/api/v2/analysis/hits"
   method := "POST"

   payload := strings.NewReader(`{
     "ssid":"{{ssid}}",
     "fileds":["TH"],
    "filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]
}`)

   client := &http.Client {
   }
   req, err := http.NewRequest(method, url, payload)

   if err != nil {
      fmt.Println(err)
      return
   }
   res, err := client.Do(req)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer res.Body.Close()

   body, err := ioutil.ReadAll(res.Body)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(body))
}
POST /api/v2/analysis/hits HTTP/1.1
Host: {{brand}}
Content-Length: 143

{
     "ssid":"{{ssid}}",
     "fileds":["TH"],
    "filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]
}
OkHttpClient client = new OkHttpClient().newBuilder()
   .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}");
Request request = new Request.Builder()
   .url("{{brand}}/api/v2/analysis/hits")
   .method("POST", body)
   .addHeader("Content-Length", "")
   .build();
Response response = client.newCall(request).execute();
var myHeaders = new Headers();
myHeaders.append("Content-Length", "");

var raw = "{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}";

var requestOptions = {
   method: 'POST',
   headers: myHeaders,
   body: raw,
   redirect: 'follow'
};

fetch("{{brand}}/api/v2/analysis/hits", requestOptions)
   .then(response => response.text())
   .then(result => console.log(result))
   .catch(error => console.log('error', error));
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
   curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
   curl_easy_setopt(curl, CURLOPT_URL, "%7B%7Bbrand%7D%7D/api/v2/analysis/hits");
   curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
   curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
   struct curl_slist *headers = NULL;
   headers = curl_slist_append(headers, "Content-Length: ");
   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
   const char *data = "{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}";
   curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
   res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);
#import 

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"%7B%7Bbrand%7D%7D/api/v2/analysis/hits"]
   cachePolicy:NSURLRequestUseProtocolCachePolicy
   timeoutInterval:10.0];
NSDictionary *headers = @{
   @"Content-Length": @""
};

[request setAllHTTPHeaderFields:headers];
NSData *postData = [[NSData alloc] initWithData:[@"{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}" dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postData];

[request setHTTPMethod:@"POST"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
   if (error) {
      NSLog(@"%@", error);
      dispatch_semaphore_signal(sema);
   } else {
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
      NSError *parseError = nil;
      NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
      NSLog(@"%@",responseDictionary);
      dispatch_semaphore_signal(sema);
   }
}];
[dataTask resume];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
open Lwt
open Cohttp
open Cohttp_lwt_unix

let postData = ref "{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}";;

let reqBody = 
   let uri = Uri.of_string "%7B%7Bbrand%7D%7D/api/v2/analysis/hits" in
   let headers = Header.init ()
      |> fun h -> Header.add h "Content-Length" ""
   in
   let body = Cohttp_lwt.Body.of_string !postData in

   Client.call ~headers ~body `POST uri >>= fun (_resp, body) ->
   body |> Cohttp_lwt.Body.to_string >|= fun body -> body

let () =
   let respBody = Lwt_main.run reqBody in
   print_endline (respBody)
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Length", "")

$body = "{`n     `"ssid`":`"{{ssid}}`",`n     `"fileds`":[`"TH`"],`n    `"filter`":[{`"key`":`"date`",`"condi`":`"range`",`"val`":`"11 18 2024 00:00:00,11 18 2024 23:59:59`"}]`n}"

$response = Invoke-RestMethod '{{brand}}/api/v2/analysis/hits' -Method 'POST' -Headers $headers -Body $body
$response | ConvertTo-Json
require "uri"
require "net/http"

url = URI("{{brand}}/api/v2/analysis/hits")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Length"] = ""
request.body = "{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}"

response = http.request(request)
puts response.read_body
printf '{
     "ssid":"{{ssid}}",
     "fileds":["TH"],
    "filter":[{"key":"date","condi":"range","val":"11 18 2024 00:00:00,11 18 2024 23:59:59"}]
}'| http  --follow --timeout 3600 POST '{{brand}}/api/v2/analysis/hits' \
 Content-Length:
import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

var semaphore = DispatchSemaphore (value: 0)

let parameters = "{\n     \"ssid\":\"{{ssid}}\",\n     \"fileds\":[\"TH\"],\n    \"filter\":[{\"key\":\"date\",\"condi\":\"range\",\"val\":\"11 18 2024 00:00:00,11 18 2024 23:59:59\"}]\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{brand}}/api/v2/analysis/hits")!,timeoutInterval: Double.infinity)
request.addValue("", forHTTPHeaderField: "Content-Length")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in 
   guard let data = data else {
      print(String(describing: error))
      semaphore.signal()
      return
   }
   print(String(data: data, encoding: .utf8)!)
   semaphore.signal()
}

task.resume()
semaphore.wait()

Example Response

 [{"key":"Date"
"value":"Thu
 21 Nov 2024 08:52:23 GMT"}
{"key":"Content-Type"
"value":"application\/json; charset=utf-8"}
{"key":"Content-Length"
"value":"41"}
{"key":"Connection"
"value":"keep-alive"}
{"key":"Access-Control-Allow-Origin"
"value":"*"}
{"key":"Access-Control-Allow-Methods"
"value":"POST
 GET
 OPTIONS
 PATCH
 DELETE"}
{"key":"Access-Control-Allow-Headers"
"value":"X-Requested-With
content-type"}
{"key":"Access-Control-Allow-Credentials"
"value":"true"}
{"key":"Vary"
"value":"Origin"}
{"key":"ETag"
"value":"W\/\"29-mA7WNmbAw5CnhahQmffAT+DzuBg\""}
{"key":"Strict-Transport-Security"
"value":"max-age=31536000; includeSubDomains"}]
 {
    "data": {},
    "status": "success",
    "code": 200
}