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:
-
Using
ssid(Session ID) -
Using
userIdandtoken
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
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
- Method: GET
-
Path:
v4-api.deepcall.com/api/v2/recording/directstream/:key/:ext/:userid/:yy/:mm/:dd/:file
Description
The Recording Direct Stream endpoint allows users to stream or download call recording files directly through a URL.
Use Cases
- Stream call recordings
- Download call recordings
- Access recording files
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
- Response: Returns audio file as binary stream
- Content Type: application/octet-stream
- CORS: Cross-origin requests are allowed
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-Jsonrequire "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 #TSSE Lavf59.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<%�����(ă��P3�l��8C�؆"�ܘ�9����}���1���gM=v-1�bm��iv��QF��"���Y��G�w����fn�0
A��q8+���A��e�Lt�*��Y