V 2.0
Call Report
Introduction
This document provides comprehensive information about the Call Report API endpoints. These endpoints allow retrieving, filtering, and exporting call log reports in various formats (CSV, Excel, PDF). The API supports advanced filtering capabilities including date ranges, agent filtering, duration filters, call types, and custom call analysis fields.
Base URL
The base URL for this API endpoint is: v4-api.deepcall.com/api/v2/callreport
Authentication
Authentication is required for all endpoints. It can be done in two ways:
- Using
ssid(Session ID) - Using
userIdandtoken
Note: When userId and token are used, ssid should not be present in the request.
Common Error Codes
These error codes can be returned by any endpoint in this API. Endpoint-specific errors are documented in their respective sections.
Authentication & Authorization Errors
| Error Code | Error Message | Description | Solution |
|---|---|---|---|
| 1000 | Invalid parameters | Request validation failed or authentication invalid | Check all required parameters are provided |
| 1014 | Invalid token | Authentication token is expired or invalid | Generate a new token or use valid ssid |
| 1015 | Permission denied | User does not have LIST_CALL_LOG permission | Contact admin to grant required permissions |
| 1047 | Invalid Request Data | Request body is empty or malformed | Ensure request body is valid JSON |
System Errors
| Error Code | Error Message | Description | Solution |
|---|---|---|---|
| 1009 | Something went wrong | Unexpected server error occurred | Retry the request or contact support |
| 1010 | Error in DB connect | Database connection is not available | Check system status or retry after some time |
Common Error Response Format
All error responses follow this structure:
{
"status": "error",
"message": "Error description here",
"code": 1000
}
List
Endpoint
- Method: POST
-
Path:
v4-api.deepcall.com/api/v2/callreport/list/
Description
The Call Reports List endpoint retrieves paginated call log records with comprehensive filtering capabilities. It supports complex queries including date ranges, agent filters, duration filters, call types, campaign filters, and custom analytics fields. The endpoint returns formatted call data ready for display in dashboards and reports.
Use Cases
- Displaying call history in dashboards
- Searching for specific calls by customer number or call ID
- Filtering calls by agent, group, campaign, or IVR
- Analyzing call performance with duration filters
- Monitoring call quality and channel issues
- Generating custom reports with multiple filter combinations
- Integrating call logs with external CRM systems
- Real-time call monitoring and tracking
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| userId | string | Yes* | User ID for authentication (*required if ssid not provided) |
| token | string | Yes* | Authentication token (*required if ssid not provided) |
| ssid | string | Yes* | Session ID (*required if userId/token not provided) |
| filter | object | No | Filter criteria object (see Filter Parameters section) |
| priorityFilter | string | No | Base64 encoded priority filter for advanced filtering |
| sz | number | No | Page size/limit (default: 50, max: 100) |
| page | number | No | Page number for pagination (default: 0) |
| pNo | number | No | Page number alternative (default: 1) |
| sAftr | array | No | Search after cursor for pagination (default: []) |
| rcrdPg | boolean | No | Include recording details (default: false) |
| query | string | No | Custom query string for advanced filtering (StringBI support) |
| indexkey | string | No | Index key for masked index mapping (StringBI support) |
Request Examples
Example 1: Get Recent Calls (Default Pagination)
{
"ssid": "{{ssid}}",
"filter": {
"dtGte": "2025-11-22 00:00:00",
"dtLte": "2025-11-22 23:59:59"
},
"sz": 100,
"page": 0
}
Example 2: Search by Customer Number
{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"cNum": "{{mobile}}",
"dtGte": "2025-11-22 00:00:00",
"dtLte": "2025-11-22 23:59:59"
},
"sz": 100,
"sAftr": [],
"page": 0
}
Example 3: Get Call by Call ID
{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"clId": "2m660tx1m173744053175158438",
"dtGte": "2025-11-17 00:00:00",
"dtLte": "2025-11-23 23:59:59"
},
"sz": 100,
"sAftr": [],
"page": 0
}
Example 4: Filter by Agents with Channel Issues
{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"chIs": "on",
"dtLte": "2025-11-23 23:59:59",
"dtGte": "2025-11-17 00:00:00",
"noAgt": 1,
"agtIds": ["1", "2", "3", "4", "5"],
"grpIds": []
},
"sz": 100,
"sAftr": [],
"page": 0
}
Example 5: Advanced Multi-Filter Query
{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"agtMngr": ["40"],
"ivr": ["-2"],
"clTy": ["OMIT"],
"exc": ["6"],
"grp": ["89"],
"amtMin": 3,
"hldCnt": "1",
"dtmf": "2",
"CT_module": 1,
"chabd": "yes",
"disCon": "no",
"dtLte": "2025-11-23 23:59:59",
"dtGte": "2025-11-17 00:00:00",
"agtIds": ["1", "2", "3", "4", "5"],
"grpIds": [],
"noAgt": 1
},
"sz": 100,
"sAftr": [],
"page": 0
}
Example 6: Get Calls with Recordings
{
"ssid": "{{ssid}}",
"filter": {
"dtGte": "2025-11-20 00:00:00",
"dtLte": "2025-11-23 23:59:59"
},
"sz": 50,
"page": 0,
"rcrdPg": true
}
Example 7: Filter by Campaign and Status
{
"userId": "{{userid}}",
"token": "{{token}}",
"filter": {
"campId": 123,
"st": ["answered"],
"dtGte": "2025-11-20 00:00:00",
"dtLte": "2025-11-23 23:59:59"
},
"sz": 100,
"page": 0
}
Example 8: Duration-Based Filtering
{
"ssid": "{{ssid}}",
"filter": {
"dur": {
"tkGte": 60,
"tkLte": 300
},
"dtGte": "2025-11-20 00:00:00",
"dtLte": "2025-11-23 23:59:59"
},
"sz": 100,
"page": 0
}
Response Details
Success Response
Status Code: 200
{
"columnArr": [
{
"key": "callId",
"label": "Call ID",
"visible": true
},
{
"key": "date",
"label": "Date",
"visible": true
}
],
"hideSectionArr": [],
"data": [
{
"callId": "2m660tx1m173744053175158438",
"date": "2025-11-22 10:30:45",
"customerNumber": "{{mobile}}",
"duration": "00:05:30",
"status": "answered",
"agent": "Agent Name",
"campaign": "Sales Campaign"
}
],
"pre": [1732267845000, "prev_call_id"],
"next": [1732267845000, "next_call_id"],
"cnt": 1234
}
Response Field Descriptions
| Field | Type | Description |
|---|---|---|
| columnArr | array | Array of column definitions for the report |
| hideSectionArr | array | Array of sections to hide in UI |
| data | array | Array of call report records |
| pre | array | Cursor for previous page [timestamp, callId] |
| next | array | Cursor for next page [timestamp, callId] |
| cnt | number | Total count of records matching criteria |
Error Response Examples
Error 1: Empty Request Body
Status Code: 200
{
"status": "error",
"message": "Invalid Request Data",
"code": 1047
}
Error 2: Permission Denied
Status Code: 200
{
"status": "error",
"message": "Permission denied",
"code": 1015
}
Error 3: Invalid Parameters
Status Code: 200
{
"status": "error",
"message": "Invalid parameter",
"code": 1000
}
List
var axios = require('axios');
var data = '{"ssid": "{{ssid}}","filter": {"dur": {},"cNum": "{{mobile}}","dtGte": "2025-11-22 00:00:00","dtLte": "2025-11-22 23:59:59"},"sz": 100,"sAftr": [],"page": 0}';
var config = {
method: 'post',
url: 'https://{{brand}}/api/v2/CallReport/list',
headers: {
'Content-Length': ''
},
data : data
};
axios(config)
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});
setUrl('https://{{brand}}/api/v2/CallReport/list');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'Content-Length' => ''
));
$request->setBody('{"ssid": "{{ssid}}","filter": {"dur": {},"cNum": "{{mobile}}","dtGte": "2025-11-22 00:00:00","dtLte": "2025-11-22 23:59:59"},"sz": 100,"sAftr": [],"page": 0}');
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}}\",\"filter\": {\"dur\": {},\"cNum\": \"{{mobile}}\",\"dtGte\": \"2025-11-22 00:00:00\",\"dtLte\": \"2025-11-22 23:59:59\"},\"sz\": 100,\"sAftr\": [],\"page\": 0}"
headers = {
'Content-Length': ''
}
conn.request("POST", "/api/v2/CallReport/list", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))var client = new RestClient("https://{{brand}}/api/v2/CallReport/list");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
var body = @"{" + "\n" +
@" ""ssid"": ""{{ssid}}""," + "\n" +
@" ""filter"": {" + "\n" +
@" ""dur"": {}," + "\n" +
@" ""cNum"": ""{{mobile}}""," + "\n" +
@" ""dtGte"": ""2025-11-22 00:00:00""," + "\n" +
@" ""dtLte"": ""2025-11-22 23:59:59""" + "\n" +
@" }," + "\n" +
@" ""sz"": 100," + "\n" +
@" ""sAftr"": []," + "\n" +
@" ""page"": 0" + "\n" +
@"}" + "\n" +
@"";
request.AddParameter("text/plain", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);curl --location -g --request POST 'https://{{brand}}/api/v2/CallReport/list' \
--data-raw '{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"cNum": "{{mobile}}",
"dtGte": "2025-11-22 00:00:00",
"dtLte": "2025-11-22 23:59:59"
},
"sz": 100,
"sAftr": [],
"page": 0
}'var request = http.Request('POST', Uri.parse('https://{{brand}}/api/v2/CallReport/list'));
request.body = '''{\n "ssid": "{{ssid}}",\n "filter": {\n "dur": {},\n "cNum": "{{mobile}}",\n "dtGte": "2025-11-22 00:00:00",\n "dtLte": "2025-11-22 23:59:59"\n },\n "sz": 100,\n "sAftr": [],\n "page": 0\n}\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 := "https://%7B%7Bbrand%7D%7D/api/v2/CallReport/list"
method := "POST"
payload := strings.NewReader(`{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"cNum": "{{mobile}}",
"dtGte": "2025-11-22 00:00:00",
"dtLte": "2025-11-22 23:59:59"
},
"sz": 100,
"sAftr": [],
"page": 0
}`)
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/CallReport/list HTTP/1.1
Host: {{brand}}
Content-Length: 196
{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"cNum": "{{mobile}}",
"dtGte": "2025-11-22 00:00:00",
"dtLte": "2025-11-22 23:59:59"
},
"sz": 100,
"sAftr": [],
"page": 0
}OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "{\n \"ssid\": \"{{ssid}}\",\n \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}\n");
Request request = new Request.Builder()
.url("https://{{brand}}/api/v2/CallReport/list")
.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 \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}\n";
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://{{brand}}/api/v2/CallReport/list", 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, "https://%7B%7Bbrand%7D%7D/api/v2/CallReport/list");
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 \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}\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:@"https://%7B%7Bbrand%7D%7D/api/v2/CallReport/list"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
NSDictionary *headers = @{
@"Content-Length": @""
};
[request setAllHTTPHeaderFields:headers];
NSData *postData = [[NSData alloc] initWithData:[@"{\n \"ssid\": \"{{ssid}}\",\n \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}\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 \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}";;
let reqBody =
let uri = Uri.of_string "https://%7B%7Bbrand%7D%7D/api/v2/CallReport/list" 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 `"filter`": {`n `"dur`": {},`n `"cNum`": `"{{mobile}}`",`n `"dtGte`": `"2025-11-22 00:00:00`",`n `"dtLte`": `"2025-11-22 23:59:59`"`n },`n `"sz`": 100,`n `"sAftr`": [],`n `"page`": 0`n}`n"
$response = Invoke-RestMethod 'https://{{brand}}/api/v2/CallReport/list' -Method 'POST' -Headers $headers -Body $body
$response | ConvertTo-Jsonrequire "uri"
require "net/http"
url = URI("https://{{brand}}/api/v2/CallReport/list")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Length"] = ""
request.body = "{\n \"ssid\": \"{{ssid}}\",\n \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}"
response = https.request(request)
puts response.read_body
printf '{
"ssid": "{{ssid}}",
"filter": {
"dur": {},
"cNum": "{{mobile}}",
"dtGte": "2025-11-22 00:00:00",
"dtLte": "2025-11-22 23:59:59"
},
"sz": 100,
"sAftr": [],
"page": 0
}
'| http --follow --timeout 3600 POST 'https://{{brand}}/api/v2/CallReport/list' \
Content-Length:import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif
var semaphore = DispatchSemaphore (value: 0)
let parameters = "{\n \"ssid\": \"{{ssid}}\",\n \"filter\": {\n \"dur\": {},\n \"cNum\": \"{{mobile}}\",\n \"dtGte\": \"2025-11-22 00:00:00\",\n \"dtLte\": \"2025-11-22 23:59:59\"\n },\n \"sz\": 100,\n \"sAftr\": [],\n \"page\": 0\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "https://{{brand}}/api/v2/CallReport/list")!,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":"Sun
23 Nov 2025 08:56:37 GMT"}
{"key":"Content-Type"
"value":"application\/json; charset=utf-8"}
{"key":"Content-Length"
"value":"330"}
{"key":"Connection"
"value":"keep-alive"}
{"key":"Access-Control-Allow-Origin"
"value":"*"}
{"key":"Access-Control-Allow-Methods"
"value":"GET
PUT
POST
DELETE
OPTIONS"}
{"key":"Access-Control-Allow-Headers"
"value":"session-token
Authorization
Origin
Accept
Content-Type
DNT
Authorization
Keep-Alive
User-Agent
X-Requested-With
If-Modified-Since
Cache-Control
Content-Type
Content-Range
Range"}
{"key":"Access-Control-Allow-Credentials"
"value":"true"}
{"key":"Vary"
"value":"Origin"}
{"key":"ETag"
"value":"W\/\"14a-FoAEJBrob5gdqn6kHOb8nHlxL0o\""}
{"key":"Strict-Transport-Security"
"value":"max-age=15724800; includeSubDomains"}
{"key":"Access-Control-Max-Age"
"value":"1728000"}]
{
"columnArr": {
"1": "Caller Number",
"2": "Time",
"3": "DID Number",
"4": "Campaign",
"5": "Agents",
"6": "Master Agent",
"7": "Call Duration",
"8": "Customer Duration",
"9": "Total Talk Duration",
"10": "Agent on Call Duration",
"11": "Amount",
"12": "Rec.",
"13": "Status",
"14": "Details",
"15": "Forward",
"16": "DTMF"
},
"hideSectionArr": [],
"data": [],
"cnt": 0
}