V 2.0

Recording

Description

The Recording API provides functionality to manage and access call recordings in a system. This API is essential for accessing and managing call recordings securely.

Base URL

The base URL for all API endpoints is: v4-api.deepcall.com/api/v2/

Authentication

Authentication is required for all endpoints. It can be done in two ways:

  1. Using ssid (Session ID)

  2. Using userId and token

Note: When userId and token are used, ssid should not be present in the request.

Error Codes

Recording API Specific Error Codes

Error Code Description
1000 Invalid parameter
1001 Invalid data type
1002 UserId not provided
1003 AgentId does not exist
1004 File not found
1005 Invalid contact number
1006 GroupId does not exist
1007 Cli number not found
1008 Cli number is not valid
1009 Something went wrong
1010 Error in DB connect
1011 Invalid credentials
1012 No data found
1013 Invalid user id
1014 Invalid token
1015 Permission denied
1016 Agent data not found
1017 Error getting DB Details
1018 Invalid panel package id
1019 Invalid response
1020 Token not found
1021 Invalid module
1022 Field cannot be empty
1023 Invalid email address
1024 Invalid character found, only letters, whitespace, and dot(.) are allowed
1025 Invalid Url
1026 Invalid number, only integer or float are allowed
1027 Only agent allowed to call this API
1028 Invalid date format
1029 Invalid field value
1030 Invalid or empty array
1031 Invalid list field value
1032 Internal server error
1033 Service unavailable
1034 Field cross maximum limit of 30 characters
1035 Field has invalid character
1036 Field value has invalid character
1037 Number of characters cross maximum limit of 60 characters
1038 OBD plan not found
1039 User account suspend
1040 Next due date not found
1041 Next due date passed
1042 Insufficient wallet amount
1043 Agent is not login
1044 SSID file does not exist
1045 Channel not available
1046 Connection error
1047 Invalid Request Data
1048 Invalid date time format

Direct Stream

https://v4-api.deepcall.com/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3

Introduction

This document provides detailed information about the Recording Direct Stream API endpoint. It includes request parameters, response formats, and examples.

Base URL

The base URL for this API endpoint is: v4-api.deepcall.com/api/v2/recording

Authentication

This endpoint uses URL path-based access. No separate authentication headers are required.


Recording Direct Stream

Endpoint

Description

The Recording Direct Stream endpoint allows users to stream or download call recording files directly through a URL.

Use Cases

URL Path Parameters

Parameter Type Required Description
key string Yes Access key
ext string Yes File extension (mp3)
userid string Yes User ID
yy string Yes Year (4 digits)
mm string Yes Month (2 digits)
dd string Yes Day (2 digits)
file string Yes Recording filename

Request Example

Direct Stream URL

v4-api.deepcall.com/api/v2/recording/directstream/{{key}}/mp3/{{userid}}/2025/11/17/{{filename}}.mp3

Response Details

Success Response

Status Code: 200

Headers:

Header Value
Content-Type application/octet-stream
Content-Length File size in bytes
Access-Control-Allow-Origin *
Access-Control-Allow-Methods GET, PUT, POST, DELETE, OPTIONS
Access-Control-Allow-Credentials true

Response Body:

Binary audio file data

Notes

Example cURL Request

curl -X GET "v4-api.deepcall.com/api/v2/recording/directstream/{{key}}/mp3/{{userid}}/2025/11/17/{{filename}}.mp3" \
  --output recording.mp3

Direct Stream

var axios = require('axios');

var config = {
 method: 'get',
 url: '{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3',
 headers: { }
};

axios(config)
.then(function (response) {
 console.log(JSON.stringify(response.data));
})
.catch(function (error) {
 console.log(error);
});
setUrl('{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
 'follow_redirects' => TRUE
));
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 = ''
headers = {}
conn.request("GET", "/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
var client = new RestClient("{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
curl --location -g --request GET '{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3'
var request = http.Request('GET', Uri.parse('{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3'));


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

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

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

func main() {

   url := "%7B%7Bbrand%7D%7D/api/v2/recording/directstream/%7B%7Bssid%7D%7D/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3"
   method := "GET"

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

   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))
}
GET /api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3 HTTP/1.1
Host: {{brand}}
OkHttpClient client = new OkHttpClient().newBuilder()
   .build();
Request request = new Request.Builder()
   .url("{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3")
   .method("GET", null)
   .build();
Response response = client.newCall(request).execute();
var requestOptions = {
   method: 'GET',
   redirect: 'follow'
};

fetch("{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3", 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, "GET");
   curl_easy_setopt(curl, CURLOPT_URL, "%7B%7Bbrand%7D%7D/api/v2/recording/directstream/%7B%7Bssid%7D%7D/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3");
   curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
   curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
   struct curl_slist *headers = NULL;
   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
   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/recording/directstream/%7B%7Bssid%7D%7D/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3"]
   cachePolicy:NSURLRequestUseProtocolCachePolicy
   timeoutInterval:10.0];

[request setHTTPMethod:@"GET"];

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 reqBody = 
   let uri = Uri.of_string "%7B%7Bbrand%7D%7D/api/v2/recording/directstream/%7B%7Bssid%7D%7D/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3" in
   Client.call `GET uri >>= fun (_resp, body) ->
   body |> Cohttp_lwt.Body.to_string >|= fun body -> body

let () =
   let respBody = Lwt_main.run reqBody in
   print_endline (respBody)
$response = Invoke-RestMethod '{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3' -Method 'GET' -Headers $headers
$response | ConvertTo-Json
require "uri"
require "net/http"

url = URI("{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
http --follow --timeout 3600 GET '{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3'
import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

var semaphore = DispatchSemaphore (value: 0)

var request = URLRequest(url: URL(string: "{{brand}}/api/v2/recording/directstream/{{ssid}}/mp3/29791451/2025/11/17/kmleuz1c89qsv0dnhcsuc1zbg_919024702505_2025-11-17-10-33-3_CTC.mp3")!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"

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":"Mon
 17 Nov 2025 06:51:24 GMT"}
{"key":"Content-Type"
"value":"application\/octet-stream"}
{"key":"Content-Length"
"value":"4221"}
{"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":"Strict-Transport-Security"
"value":"max-age=15724800; includeSubDomains"}
{"key":"Access-Control-Max-Age"
"value":"1728000"}]
 ID3#TSSELavf59.27.100��(�v��A��L�c�c��1��xs��!	�!O�Nq`A�� P �����?�@}�88�'߬�A���.�8� ����8�9��m�@Ѕ�d}8�<�Y�O���c\���(�"%ˢ�ɉ@����2�zcd�)��vQ�@�q!�KH�C�q.9`8,\b��'#I,4r|
�.Gլ�.�TOWdI4`͛�Hք��#^��v�6����c,p�s��t�e��Dd�������	"s�-�~����u�*���(�
 J�ݑ�0�&`��ԳϦ�h��Q��g�Eј��R
�UR$�s
t֞�"m�y墓�~l	
�y�3]�]�+��
ז���c�)�����췻�}Z;嚾Ol��9,.XP,y1;v
��rM���i>-�;w�6�5��(� ۺ�Ɇ0��bn�Q�b<9���� EɆ����ZR{�uI�����Q�T������Ү�@�˔������ב�mN�4�䄄���6������B!��g���N�'4�������=����������5^�PL ��(�
C���@5�$���Y�OJ��ڱ��0��W}E�0½J�f��>�,>��Jx����*_�t��9d�]-	�
����?{M���Q����Ji�����+�I�!���|
ñ�J����ۏ5�?�A��:!����(�"+�͑�@�R�CPY��Ũ�K���:���T�����F� ,\�jbY����)�?���C�`AlB%9��}���,80?�������0�����u��ACG���3Cz%�f��W��Jӟ����ϯ�$z
�� F(��HM���(�
 +�ё�(�(@7�f�'D0�E��
p�X���&"����qA�� (AEp
�RKC+'�w`����T��D�K��E9C���܄wt��`�?���.�W��&r��1�R�J!E�0�ݮΈ+i�JY���(� ����0������5�/ټ���s�d��L���FZ�>�\G�ҳ;s0�>I�[��m>��}�)�ѽ���e�zD�F�;��ݨϨ֨7aₓ��t��)���/��l��w�<����su�]&��[=��e0x������(� �r�Y�@4^�Q���h�b vd�Ē.~(������:J�i�^2eaa�GFD>/D����p��T��H2ꪾ������1A���
>o�ݪx����y_�RE����P<0@��(R���@���)F:�"���(��ّ����=�J�������+�Bܮ]�6LB��~q���04�pMKfl�����XFk���l�zk`�`�:�j�I�U������$�u��\�9��'��zj�iZ8���c���]KE��UW��Y�%W$R
8�c�"E[��(�$IѫF��sm����,�,	�(q��C�B��A>*�Jr�**��j��5��s�3BO��L{������!�S�]��U�H$�YkvJ�J�ll����2M*DW��I�Uҿ�q'�*?zI�iv����(�5��Y�@�>���ԺAtc*�,R�h�$�h�SIj���D��q)j,+���u�}�CŭA�h�v.u(6�4t	��Go*�����u�K�󎷺�
�Hf!���:bdo���i���۫O�]{=�������O���(�:x�}��|��95�I.��U�F� f�sng^*���9�M���q2�G��qƮ4_�,r�����3���ې/�M'������_o�e��:��ї�h]zզ,	�8w�E�D:�y��h�	Pq��{9�-�s�0<%�����(ă��P3�l��8C�؆"�ܘ�9����}���1���gM=v-1�bm��iv��QF��"���Y��G�w����fn�0
A��q8+���A��e�Lt�*��Y�s��P L6�y��*���1��DN̋����OȴC��e3C���>�����^����(ė+�nHT�F�F�K�����J>��]�!N��'@#Z�
Z�W��8�S�0��K,����y�G�FW"̩q� "�0�Y����H�6���	����`��H'�� ��o�zN��({���~�o�s�q�勞�/�
��H���?����(�l+
©2021-2025 DeepCall (Powered by Sarv.com). All rights reserved.