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

{{brand}}/api/v2/Masking/set

Endpoint

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

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
}