SMS promotionnels – exemples (Advanced API)
Exemples d'utilisation de Advanced promotional, version 2.0 de l'API. Pour les canaux alternatifs et la cascade, voir Cascade de canaux.
Plusieurs destinataires
number accepte un tableau de numéros de téléphone ; tous reçoivent le même texte.
POST /api/2.0/advanced/promotional HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": [
"420777777777",
"420777777778"
],
"text": "Spring sale starts today, up to 50 % off."
}
Texte propre à chaque destinataire
Au lieu d'un simple numéro, vous pouvez transmettre un objet avec text, variables et country.
POST /api/2.0/advanced/promotional HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": [
{
"number": "420777777777",
"text": "Hello John, spring sale starts today."
},
{
"number": "777777778",
"country": "cz",
"variables": {
"first_name": "Jana"
}
}
],
"text": "Hello <first_name>, spring sale starts today."
}
Numéros, groupes et administrateurs à la fois
Les trois sources ne s'excluent pas - les destinataires s'additionnent. Voir Promotional groups et Promotional admins.
POST /api/2.0/advanced/promotional HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": [
"420777777777"
],
"groups": [
974
],
"admins": [
154
],
"text": "Hello <first_name>, spring sale starts today."
}
Campagne planifiée avec protection contre les doublons
same_number écarte tout message supplémentaire vers un numéro déjà présent dans la campagne ; same_text n'écarte que les messages au texte identique.
POST /api/2.0/advanced/promotional HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [
974
],
"text": "Spring sale starts today.",
"country": "cz",
"schedule": "2026-09-14T09:00:00+02:00",
"duplicates_check": "same_number",
"tag": "spring-sale"
}
Campagne via un canal alternatif
Viber avec une image et un bouton, SMS en solution de repli. Les objets des canaux sont décrits dans Canaux.
POST /api/2.0/advanced/promotional HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [
974
],
"text": "Spring sale starts today, up to 50 % off.",
"channel": {
"viber": {
"sender": "BulkGate",
"image": "https://example.com/spring-sale.jpg",
"button": {
"caption": "Open the offer",
"url": "https://example.com/spring-sale"
}
},
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
La réponse est décrite dans la spécification.
Exemples de code
Voici la même requête dans différents langages de programmation :
La signification de chaque paramètre est décrite dans la spécification.
PHP
php.net
$context = stream_context_create(['http' => [
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => json_encode([
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj',
'groups' => [974, 975],
'text' => 'Hello <first_name>, spring sale starts today.',
'duplicates_check' => 'same_number',
'channel' => [
'sms' => [
'sender_id' => 'gText',
'sender_id_value' => 'BulkGate',
],
],
], JSON_THROW_ON_ERROR),
'timeout' => 30,
'ignore_errors' => true,
]]);
$body = file_get_contents('https://portal.bulkgate.com/api/2.0/advanced/promotional', false, $context);
if ($body === false)
{
throw new RuntimeException('BulkGate API did not respond.');
}
$response = json_decode($body, true, flags: JSON_THROW_ON_ERROR);
if (isset($response['error']))
{
throw new RuntimeException("BulkGate: {$response['error']} ({$response['type']})");
}
print_r($response['data']);
PHP cURL
php.net/curl
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://portal.bulkgate.com/api/2.0/advanced/promotional',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj',
'groups' => [974, 975],
'text' => 'Hello <first_name>, spring sale starts today.',
'duplicates_check' => 'same_number',
'channel' => [
'sms' => [
'sender_id' => 'gText',
'sender_id_value' => 'BulkGate',
],
],
], JSON_THROW_ON_ERROR),
]);
$body = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if ($error !== '')
{
throw new RuntimeException("BulkGate API: $error");
}
print_r(json_decode($body, true, flags: JSON_THROW_ON_ERROR));
PHP Guzzle
docs.guzzlephp.org
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
$client = new Client(['timeout' => 30, 'http_errors' => false]);
try
{
$result = $client->post('https://portal.bulkgate.com/api/2.0/advanced/promotional', ['json' => [
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj',
'groups' => [974, 975],
'text' => 'Hello <first_name>, spring sale starts today.',
'duplicates_check' => 'same_number',
'channel' => [
'sms' => [
'sender_id' => 'gText',
'sender_id_value' => 'BulkGate',
],
],
]]);
}
catch (GuzzleException $e)
{
throw new RuntimeException('BulkGate: ' . $e->getMessage(), previous: $e);
}
$response = json_decode((string) $result->getBody(), true, flags: JSON_THROW_ON_ERROR);
print_r($response);
Go
go.dev
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
url := "https://portal.bulkgate.com/api/2.0/advanced/promotional"
payload := strings.NewReader(`{"application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "groups": [974, 975], "text": "Hello <first_name>, spring sale starts today.", "duplicates_check": "same_number", "channel": {"sms": {"sender_id": "gText", "sender_id_value": "BulkGate"}}}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res.StatusCode, string(body))
}
Python
python.org
import http.client, json
connection = http.client.HTTPSConnection('portal.bulkgate.com')
connection.request('POST', '/api/2.0/advanced/promotional', json.dumps({
'application_id': 451,
'application_token': 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj',
'groups': [974, 975],
'text': 'Hello <first_name>, spring sale starts today.',
'duplicates_check': 'same_number',
'channel': {
'sms': {
'sender_id': 'gText',
'sender_id_value': 'BulkGate',
},
},
}), {
'Content-Type': 'application/json'
})
response = connection.getresponse()
print(response.status, response.read().decode())
Node.js
nodejs.org
const response = await fetch("https://portal.bulkgate.com/api/2.0/advanced/promotional", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [974, 975],
"text": "Hello <first_name>, spring sale starts today.",
"duplicates_check": "same_number",
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}),
});
const result = await response.json();
if (result.error) {
throw new Error(`BulkGate: ${result.error} (${result.type})`);
}
console.log(result.data);
Java
java.net.http.HttpClient
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://portal.bulkgate.com/api/2.0/advanced/promotional"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [
974,
975
],
"text": "Hello <first_name>, spring sale starts today.",
"duplicates_check": "same_number",
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
Kotlin
kotlinlang.org
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
val payload = """
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [
974,
975
],
"text": "Hello <first_name>, spring sale starts today.",
"duplicates_check": "same_number",
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
""".trimIndent()
val request = HttpRequest.newBuilder()
.uri(URI.create("https://portal.bulkgate.com/api/2.0/advanced/promotional"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build()
val response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString())
println("${response.statusCode()} ${response.body()}")
C# .NET
learn.microsoft.com
using System.Net.Http;
using System.Text;
var payload = """
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [
974,
975
],
"text": "Hello <first_name>, spring sale starts today.",
"duplicates_check": "same_number",
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
""";
using var client = new HttpClient();
var response = await client.PostAsync(
"https://portal.bulkgate.com/api/2.0/advanced/promotional",
new StringContent(payload, Encoding.UTF8, "application/json"));
Console.WriteLine($"{(int) response.StatusCode} {await response.Content.ReadAsStringAsync()}");
C++ libcurl
curl.se/libcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t collect(char *data, size_t size, size_t nmemb, std::string *out)
{
out->append(data, size * nmemb);
return size * nmemb;
}
int main()
{
const std::string payload = R"json(
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"groups": [
974,
975
],
"text": "Hello <first_name>, spring sale starts today.",
"duplicates_check": "same_number",
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
)json";
CURL *curl = curl_easy_init();
if (curl == nullptr)
{
std::cerr << "curl_easy_init failed\n";
return 1;
}
curl_slist *headers = curl_slist_append(nullptr, "Content-Type: application/json");
std::string body;
curl_easy_setopt(curl, CURLOPT_URL, "https://portal.bulkgate.com/api/2.0/advanced/promotional");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, collect);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
const CURLcode result = curl_easy_perform(curl);
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
if (result != CURLE_OK)
{
std::cerr << curl_easy_strerror(result) << "\n";
return 1;
}
std::cout << status << " " << body << "\n";
return 0;
}
Ruby
ruby-lang.org
require 'json'
require 'net/http'
uri = URI('https://portal.bulkgate.com/api/2.0/advanced/promotional')
response = Net::HTTP.post(uri, {
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj',
'groups' => [974, 975],
'text' => 'Hello <first_name>, spring sale starts today.',
'duplicates_check' => 'same_number',
'channel' => {
'sms' => {
'sender_id' => 'gText',
'sender_id_value' => 'BulkGate'
}
}
}.to_json, 'Content-Type' => 'application/json')
puts "#{response.code} #{response.body}"
Bash cURL
curl.se
curl --request POST \
--url https://portal.bulkgate.com/api/2.0/advanced/promotional \
--header 'Content-Type: application/json' \
--data '{"application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "groups": [974, 975], "text": "Hello <first_name>, spring sale starts today.", "duplicates_check": "same_number", "channel": {"sms": {"sender_id": "gText", "sender_id_value": "BulkGate"}}}'
Cette page vous a-t-elle été utile ?
Merci pour votre retour.