Launch click to call
This method allows you to start a click-to-call toward multiple destinations.
Resource
https://api.infobip.com/voice/ctc/1/send
Parameters
Property name | Type | Description |
---|---|---|
bulkid | string | The ID which uniquely identifies the request. |
messageId | string | The ID that uniquely identifies the established call. |
from | string | Numeric sender ID in E.164 format. Will be shown to "destinationA". |
fromB | string | Numeric sender ID in E.164 format. If set, it will be shown to "destinationB". If not set, "from" or "destinationA" will be shown to "destinationB", depending on the value of "anonymization". |
destinationA | string | Original destination address. Address must be in the international format (Example: 41793026727). |
destinationB | string | Destination address to which the call will be transferred after successful answering. Address must be in the international format (Example: 41793026727). |
text | string | Text of the message that will be played before call transfer. |
language | string |
If the message is in text format, languages in which the message is written must be defined for correct pronunciation. In the Languages section you can find the list of languages that we support. If not set, default language is English [en]. |
voice | object | Used to define voice in which text would be synthesized. It has two parameters: name and gender. When only name is provided, then that exact voice with that name will be used to synthesize text. If only gender is provided, then text is synthesized with first voice in given gender. Gender can be male or female. If voice is not set, then default voice is used. |
audioFileUrl | string | Besides the text format of the message played before call transfer, audio recording (in waw or mp3 format) can also be delivered. Audio file must be uploaded online so the existing URL can be available for the file download. Size of the audio file must be below 4 MB. |
anonymization | boolean | Deafult value is false. If set, same numeric sender (defined in "from") is used for both calls (towards "destinationA" and "destinationB"). If not set, "destinationA" will be shown to "destinationB". If "fromB" is set up, "anonymization" will not be applied; "from" will be shown to "destinationA" and "fromB" will be shown to "destinationB". |
notifyUrl | string | The URL on your callback server on which the Delivery report will be sent. |
notifyContentType | string | Preferred Delivery report content type. Can be application/json or application/xml. |
maxDuration | int | Maximum duration of transferred call in seconds. If set, when maxDuration is reached call will be terminated. |
warningTime | int |
Time before the end of the transferred call, in seconds, when warning beep sound will be played. For example, if maxDuration is set to 60 and warningTime is set to 5, this means that warning beep will be played on 55. second of the transferred call, or 5 seconds before it's end. |
retry | object | Used to define if the delivery of the Voice messages should be retried in case the first try doesn't succeed. Additional retries will be made according to the schedule defined by minPeriod and maxPeriod parameters and platform's internal retry logic. If the minPeriod differs maxPeriod, delivery will be retried in the following manner: after 1 min, 2 min, 5 min, 10 min, 20 min, 30 min, 1 hour, 2 hours, 4 hours, 8 hours, 16 hours, 24 hours or until maxPeriod is reached. If the retry attempt for the MaxPeriod is reached, the MaxPeriod will be used for all subsequent retries. If the minPeriod and the maxPeriod are defined as equal values, the period of time between retries will be equal to this value. Message delivery will be retried until the successful delivery or message validity or maxCount value is reached. |
minPeriod | int | Defines the minimal waiting time (in minutes) after the previous failed attempt to try to deliver the message again. |
maxPeriod | int | Defines the maximum waiting time (in minutes) after the previous failed attempt to try to deliver the message again. |
maxCount | int | Specify the maximum number of retry attempts. Maximum value of the maxCount is 4. Higher value, if entered will be set to 4. |
machineDetection | string | Used for enabling detection of answering machine after the call has been answered. The only possible value is "hangup". When set, machine detection is enabled and if a machine is detected call is hung up. |
Request Example
POST /voice/ctc/1/send HTTP/1.1
Host: {base_url}
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Content-Type: application/json
Accept: application/json
{
"bulkId": "BULK-ID-123-xyz",
"messages": [
{
"messageId": "MESSAGE-ID-123-xyz",
"from": "41793026700",
"fromB": "41793026701",
"destinationA": "41793026727",
"destinationB": "41793026731",
"text": "Test Voice message.",
"language": "en",
"voice": {
"name": "Joanna",
"gender": "female"
},
"anonymization": false,
"notifyUrl": "https://www.example.com/voice/clicktocall",
"notifyContentType": "application/json",
"maxDuration": 60,
"warningTime": 5,
"retry": {
"minPeriod": 1,
"maxPeriod": 5,
"maxCount": 5
},
"machineDetection": "hangup"
}
]
}
curl -X POST \
http:// \
-H 'cache-control: no-cache' \
-H 'postman-token: ee3cf632-75b7-6580-c54b-f1368240be58' \
-d 'POST /voice/ctc/1/send HTTP/1.1
Host: {base_url}
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Content-Type: application/json
Accept: application/json
{
"bulkId": "BULK-ID-123-xyz",
"messages": [
{
"messageId": "MESSAGE-ID-123-xyz",
"from": "41793026700",
"destinationA": "41793026727",
"fromB":"41793026701",
"destinationB": "41793026731",
"text": "Test Voice message.",
"language": "en",
"voice": {
"name": "Joanna",
"gender": "female"
},
"anonymization": false,
"notifyUrl": "https://www.example.com/voice/clicktocall",
"notifyContentType": "application/json",
"maxDuration": 60,
"warningTime": 5,
"retry": {
"minPeriod": 1,
"maxPeriod": 5,
"maxCount": 5
},
"machineDetection": "hangup"
}
]
}
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://{base_url}/voice/ctc/1/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{
\"bulkId\": \"BULK-ID-123-xyz\",
\"messages\": [
{
\"messageId\": \"MESSAGE-ID-123-xyz\",
\"from\": \"41793026700\",
\"destinationA\": \"41793026727\",
\"fromB\":\"41793026701\",
\"destinationB\": \"41793026731\",
\"text\": \"Test Voice message.\",
\"language\": \"en\",
\"voice\": {
\"name\": \"Joanna\",
\"gender\": \"female\"
},
\"anonymization\": false,
\"notifyUrl\": \"https://www.example.com/voice/clicktocall\",
\"notifyContentType\": \"application/json\",
\"maxDuration\": 60,
\"warningTime\": 5,
\"retry\":
{
\"minPeriod\": 1,
\"maxPeriod\": 5,
\"maxCount\": 5
},
\"machineDetection\": \"hangup\"
}
]
}",
CURLOPT_HTTPHEADER => array(
"authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=",
"content-type: application/json",
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
require 'uri'
require 'net/http'
url = URI("https://{base_url}/voice/ctc/1/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(url)
request["authorization"] = 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ='
request["content-type"] = 'application/json'
request.body = "{
\"bulkId\": \"BULK-ID-123-xyz\",
\"messages\": [
{
\"messageId\": \"MESSAGE-ID-123-xyz\",
\"from\": \"41793026700\",
\"destinationA\": \"41793026727\",
\"fromB\":\"41793026701\",
\"destinationB\": \"41793026731\",
\"text\": \"Test Voice message.\",
\"language\": \"en\",
\"voice\": {
\"name\": \"Joanna\",
\"gender\": \"female\"
},
\"anonymization\": false,
\"notifyUrl\": \"https://www.example.com/voice/clicktocall\",
\"notifyContentType\": \"application/json\",
\"maxDuration\": 60,
\"warningTime\": 5,
\"retry\": {
\"minPeriod\": 1,
\"maxPeriod\": 5,
\"maxCount\": 5
},
\"machineDetection\": \"hangup\"
}
]}"
response = http.request(request)
puts response.read_body
import http.client
conn = http.client.HTTPSConnection("{base_url}")
payload = "{
\"bulkId\": \"BULK-ID-123-xyz\",
\"messages\": [
{
\"messageId\": \"MESSAGE-ID-123-xyz\",
\"from\": \"41793026700\",
\"destinationA\": \"41793026727\",
\"fromB\":\"41793026701\",
\"destinationB\": \"41793026731\",
\"text\": \"Test Voice message.\",
\"language\": \"en\",
\"voice\": {
\"name\": \"Joanna\",
\"gender\": \"female\"
},
\"anonymization\": false,
\"notifyUrl\": \"https://www.example.com/voice/clicktocall\",
\"notifyContentType\": \"application/json\",
\"maxDuration\": 60,
\"warningTime\": 5,
\"retry\": {
\"minPeriod\": 1,
\"maxPeriod\": 5,
\"maxCount\": 5
},
\"machineDetection\": \"hangup\"
}
]
}"
headers = {
'authorization': "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=",
'content-type': "application/json",
}
conn.request("POST", "/voice/ctc/1/send", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://{base_url}/voice/ctc/1/send")
.header("authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=")
.header("content-type", "application/json")
.body("{
\"bulkId\": \"BULK-ID-123-xyz\",
\"messages\": [
{
\"messageId\": \"MESSAGE-ID-123-xyz\",
\"from\": \"41793026700\",
\"fromB\":\"41793026701\",
\"destinationA\": \"41793026727\",
\"destinationB\": \"41793026731\",
\"text\": \"Test Voice message.\",
\"language\": \"en\",
\"voice\": {
\"name\": \"Joanna\",
\"gender\": \"female\"
},
\"anonymization\": false,
\"notifyUrl\": \"https://www.example.com/voice/clicktocall\",
\"notifyContentType\": \"application/json\",
\"maxDuration\": 60,
\"warningTime\": 5,
\"retry\": {
\"minPeriod\": 1,
\"maxPeriod\": 5,
\"maxCount\": 5
},
\"machineDetection\": \"hangup\"
}
]
}")
.asString();
var client = new RestClient("https://{base_url}/voice/ctc/1/send");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/json");
request.AddHeader("authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=");
request.AddParameter("application/json",
"{
\"bulkId\": \"BULK-ID-123-xyz\",
\"messages\": [
{
\"messageId\": \"MESSAGE-ID-123-xyz\",
\"from\": \"41793026700\",
\"destinationA\": \"41793026727\",
\"fromB\":\"41793026701\",
\"destinationB\": \"41793026731\",
\"text\": \"Test Voice message.\",
\"language\": \"en\",
\"voice\": {
\"name\": \"Joanna\",
\"gender\": \"female\"
},
\"anonymization\": false,
\"notifyUrl\": \"https://www.example.com/voice/clicktocall\",
\"notifyContentType\": \"application/json\",
\"maxDuration\": 60,
\"warningTime\": 5,
\"retry\": {
\"minPeriod\": 1,
\"maxPeriod\": 5,
\"maxCount\": 5
},
\"machineDetection\": \"hangup\"
}
]
}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
var data = "{
\"bulkId\": \"BULK-ID-123-xyz\",
\"messages\": [
{
\"messageId\": \"MESSAGE-ID-123-xyz\",
\"from\": \"41793026700\",
\"destinationA\": \"41793026727\",
\"fromB\":\"41793026701\",
\"destinationB\": \"41793026731\",
\"text\": \"Test Voice message.\",
\"language\": \"en\",
\"voice\": {
\"name\": \"Joanna\",
\"gender\": \"female\"
},
\"anonymization\": false,
\"notifyUrl\": \"https://www.example.com/voice/clicktocall\",
\"notifyContentType\": \"application/json\",
\"maxDuration\": 60,
\"warningTime\": 5,
\"retry\": {
\"minPeriod\": 1,
\"maxPeriod\": 5,
\"maxCount\": 5
},
\"machineDetection\": \"hangup\"
}
]
}";
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://{base_url}/voice/ctc/1/send");
xhr.setRequestHeader("authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=");
xhr.setRequestHeader("content-type", "application/json");
xhr.send(data);
Response
{
"bulkId": "BULK-ID-123-xyz",
"messages": [
{
"to": "41793026727",
"status": {
"groupId": 1,
"groupName": "PENDING",
"id": 26,
"name": "PENDING_ACCEPTED",
"description": "Message accepted, pending for delivery."
},
"messageId": "MESSAGE-ID-123-xyz"
}
]
}
Response format
If successful, the response header HTTP status code will be 200 OK
.
If you try to send the request without authorization, you will receive a 401 Unauthorized
error.
Voice Response
Parameter | Type | Description |
---|---|---|
bulkId | String | The ID that uniquely identifies the request. Bulk ID will be received when a message is sent to more than one destination address. |
messages | VoiceResponseDetails | Array of sent message objects, one object per message. |
Voice Response Details
Parameter | Type | Description |
---|---|---|
to | String | The message destination address. |
status | Status | Indicates whether the message has been sent successfully, not sent, delivered, not delivered, waiting for delivery, or other status. |
messageId | String | The ID that uniquely identifies the sent message. |
Status
Parameter | Type | Description |
---|---|---|
groupId | int | Status group ID. |
groupName | String | Status group name. |
id | int | Status ID. |
name | String | Status name. |
description | String | Human readable description of the status. |