V 2.0
Masking
Introduction
The Masking API provides the facility to mask phone numbers for temporary, anonymous communication channels. This API is useful for call centers, customer support, and privacy-focused applications.
Error Codes
Specific error codes for the Masking API, taken from the SarvErrors.js file:
Error Code | Description |
---|---|
1501 | m1 and m2 cannot be the same |
1502 | Expiry must be an integer value |
1503 | Your masking request could not be expired until now. So you cannot make another request |
1504 | Masking could not be inserted |
1505 | Masking number not available |
Is there anything else you would like me to help you with regarding this document?
Set
Endpoint
-
Method: POST
-
Path:
deepcall/api/v2/Masking/set
Description
Set Masking is a feature that allows creating a temporary, secure communication channel between two phone numbers. It enables temporary number masking to protect user privacy and maintain confidentiality during communications, typically used in customer support, marketplace interactions, or service platforms where direct phone number exchange is not desired.
Parameters
Parameter Type | Parameter Name | Type | Required | Description |
---|---|---|---|---|
Authentication | ssid |
String | Conditional* | Session ID for authentication |
Authentication | userId |
String | Conditional* | User identifier for authentication |
Authentication | token |
String | Conditional* | Authentication token |
Required | m1 |
String | Yes | First phone number to be masked |
Required | m2 |
String | Yes | Second phone number to be masked |
Optional | eventId |
String | No | Unique identifier for tracking the masking event |
Optional | expiry_time |
Timestamp | No | Specific date and time when masking expires |
Optional | expiry_duration |
Integer | No | Duration of masking in minutes |
*Note: Either ssid
or userId
with token
must be provided for authentication.
Additional Notes
-
Validate that both
m1
andm2
are valid phone numbers -
If both
expiry_time
andexpiry_duration
are provided,expiry_time
takes precedence -
eventId
is optional but recommended for tracking and analytics purposes -
The default expiry time is determined by system configuration
Set
var axios = require('axios');
var data = '{"ssid": "{{ssid}}","m1": {{m1}},"m2": {{m2}},"eventId": "customer_support_123","expiry_duration": 1440}';
var config = {
method: 'post',
url: '{{brand}}/api/v2/Masking/set',
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/Masking/set');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'Content-Length' => ''
));
$request->setBody('{"ssid": "{{ssid}}","m1": {{m1}},"m2": {{m2}},"eventId": "customer_support_123","expiry_duration": 1440}');
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}}\",\"m1\": {{m1}},\"m2\": {{m2}},\"eventId\": \"customer_support_123\",\"expiry_duration\": 1440}"
headers = {
'Content-Length': ''
}
conn.request("POST", "/api/v2/Masking/set", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
var client = new RestClient("{{brand}}/api/v2/Masking/set");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
var body = @"{" + "\n" +
@" ""ssid"": ""{{ssid}}""," + "\n" +
@" ""m1"": {{m1}}," + "\n" +
@" ""m2"": {{m2}}," + "\n" +
@" ""eventId"": ""customer_support_123""," + "\n" +
@" ""expiry_duration"": 1440" + "\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/Masking/set' \
--data-raw '{
"ssid": "{{ssid}}",
"m1": {{m1}},
"m2": {{m2}},
"eventId": "customer_support_123",
"expiry_duration": 1440
}'
var request = http.Request('POST', Uri.parse('{{brand}}/api/v2/Masking/set'));
request.body = '''{\n "ssid": "{{ssid}}",\n "m1": {{m1}},\n "m2": {{m2}},\n "eventId": "customer_support_123",\n "expiry_duration": 1440\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/Masking/set"
method := "POST"
payload := strings.NewReader(`{
"ssid": "{{ssid}}",
"m1": {{m1}},
"m2": {{m2}},
"eventId": "customer_support_123",
"expiry_duration": 1440
}`)
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/Masking/set HTTP/1.1
Host: {{brand}}
Content-Length: 130
{
"ssid": "{{ssid}}",
"m1": {{m1}},
"m2": {{m2}},
"eventId": "customer_support_123",
"expiry_duration": 1440
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "{\n \"ssid\": \"{{ssid}}\",\n \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\n}");
Request request = new Request.Builder()
.url("{{brand}}/api/v2/Masking/set")
.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 \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\n}";
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("{{brand}}/api/v2/Masking/set", 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/Masking/set");
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 \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\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/Masking/set"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
NSDictionary *headers = @{
@"Content-Length": @""
};
[request setAllHTTPHeaderFields:headers];
NSData *postData = [[NSData alloc] initWithData:[@"{\n \"ssid\": \"{{ssid}}\",\n \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\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 \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\n}";;
let reqBody =
let uri = Uri.of_string "%7B%7Bbrand%7D%7D/api/v2/Masking/set" 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 `"m1`": {{m1}},`n `"m2`": {{m2}},`n `"eventId`": `"customer_support_123`",`n `"expiry_duration`": 1440`n}"
$response = Invoke-RestMethod '{{brand}}/api/v2/Masking/set' -Method 'POST' -Headers $headers -Body $body
$response | ConvertTo-Json
require "uri"
require "net/http"
url = URI("{{brand}}/api/v2/Masking/set")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Length"] = ""
request.body = "{\n \"ssid\": \"{{ssid}}\",\n \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\n}"
response = http.request(request)
puts response.read_body
printf '{
"ssid": "{{ssid}}",
"m1": {{m1}},
"m2": {{m2}},
"eventId": "customer_support_123",
"expiry_duration": 1440
}'| http --follow --timeout 3600 POST '{{brand}}/api/v2/Masking/set' \
Content-Length:
import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif
var semaphore = DispatchSemaphore (value: 0)
let parameters = "{\n \"ssid\": \"{{ssid}}\",\n \"m1\": {{m1}},\n \"m2\": {{m2}},\n \"eventId\": \"customer_support_123\",\n \"expiry_duration\": 1440\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{brand}}/api/v2/Masking/set")!,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
28 Nov 2024 12:44:00 GMT"}
{"key":"Content-Type"
"value":"application\/json; charset=utf-8"}
{"key":"Content-Length"
"value":"67"}
{"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\/\"43-mzoeydze28BTypY0Jr7Dvj4QQAM\""}
{"key":"Strict-Transport-Security"
"value":"max-age=31536000; includeSubDomains"}]
{
"status": "error",
"message": "Masking No not available",
"code": 1505
}