No se ha encontrado nada

SMS promocional – ejemplos

Ejemplos de uso de Simple promotional. Simple API recibe los destinatarios como una única cadena separada por punto y coma; los grupos de la agenda de contactos, los administradores y los canales alternativos solo están disponibles en la Advanced API.

Varios destinatarios

number es una cadena de números de teléfono separados por punto y coma; todos reciben el mismo texto.

POST /api/1.0/simple/promotional HTTP/1.1 Host: portal.bulkgate.com Content-Type: application/json { "application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777;420606606234;420601992992", "text": "Las rebajas de primavera empiezan hoy, hasta un 50 % de descuento." }

Remitente propio y Unicode

gText envía la campaña desde un remitente de texto registrado. Active unicode siempre que el texto contenga caracteres fuera del alfabeto de 7 bits; eso acorta el mensaje a 268 caracteres por parte.

POST /api/1.0/simple/promotional HTTP/1.1 Host: portal.bulkgate.com Content-Type: application/json { "application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777;420606606234;420601992992", "text": "Las rebajas de primavera ya están aquí.", "sender_id": "gText", "sender_id_value": "BulkGate", "unicode": true }

Números locales y campaña programada

country le permite indicar los números sin el prefijo internacional. schedule acepta ISO 8601 o unix timestamp.

POST /api/1.0/simple/promotional HTTP/1.1 Host: portal.bulkgate.com Content-Type: application/json { "application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "777777777;606606234", "country": "cz", "text": "Las rebajas de primavera empiezan hoy, hasta un 50 % de descuento.", "schedule": "2026-09-14T09:00:00+02:00" }

Protección contra duplicados y tag

same_text descarta un mensaje con el mismo texto a un número que ya lo ha recibido y same_number descarta cualquier mensaje adicional al mismo número. tag etiqueta la campaña para poder localizarla más tarde.

POST /api/1.0/simple/promotional HTTP/1.1 Host: portal.bulkgate.com Content-Type: application/json { "application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777;420606606234;420601992992", "text": "Las rebajas de primavera empiezan hoy, hasta un 50 % de descuento.", "duplicates_check": "same_number", "tag": "spring-sale" }

La respuesta se describe en la especificación.

Ejemplos de código

A continuación tiene ejemplos de implementación de Simple API para enviar mensajes SMS promocionales con un ID de remitente de texto en distintos lenguajes de programación:

El significado de cada parámetro se describe en la especificación; las solicitudes sin más se encuentran en Métodos de la petición.

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', 'number' => implode(';', [ '420777777777', '420606606234', '420601992992' ]), 'text' => 'Texto del mensaje', '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/1.0/simple/promotional', false, $context); if ($body === false) { throw new RuntimeException('BulkGate API no respondió.'); } $response = json_decode($body, true, flags: JSON_THROW_ON_ERROR); if (isset($response['error'])) { throw new RuntimeException("BulkGate: {$response['error']} ({$response['type']})"); } foreach ($response['data']['response'] as $message) { echo $message['status'] === 'error' ? "{$message['number']}: {$message['error']}\n" : "{$message['number']}: {$message['status']} ({$message['sms_id']})\n"; } var_dump($response['data']['total']['status']);

PHP cURL

php.net/curl

$curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => 'https://portal.bulkgate.com/api/1.0/simple/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', 'number' => implode(';', [ '420777777777', '420606606234', '420601992992' ]), 'text' => 'Texto del mensaje', 'sender_id' => 'gText', 'sender_id_value' => 'BulkGate', ], JSON_THROW_ON_ERROR), ]); $body = curl_exec($curl); $status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE); if ($body === false) { throw new RuntimeException('BulkGate: ' . curl_error($curl)); } $response = json_decode($body, true, flags: JSON_THROW_ON_ERROR); if ($status !== 200) { throw new RuntimeException("BulkGate: {$response['error']} ({$response['type']})"); } foreach ($response['data']['response'] as $message) { echo $message['status'] === 'error' ? "{$message['number']}: {$message['error']}\n" : "{$message['number']}: {$message['status']} ({$message['sms_id']})\n"; } var_dump($response['data']['total']['status']);

PHP Guzzle

docs.guzzlephp.org

// composer require guzzlehttp/guzzle use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; $client = new Client(['timeout' => 30, 'http_errors' => false]); try { $result = $client->post('https://portal.bulkgate.com/api/1.0/simple/promotional', ['json' => [ 'application_id' => 451, 'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', 'number' => implode(';', [ '420777777777', '420606606234', '420601992992' ]), 'text' => 'Texto del mensaje', '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); // http_errors => false: el error de la API se reconoce por el código de estado; el cuerpo contiene su descripción. if ($result->getStatusCode() !== 200) { throw new RuntimeException("BulkGate: {$response['error']} ({$response['type']})"); } foreach ($response['data']['response'] as $message) { echo $message['status'] === 'error' ? "{$message['number']}: {$message['error']}\n" : "{$message['number']}: {$message['status']} ({$message['sms_id']})\n"; } var_dump($response['data']['total']['status']);

Go

go.dev

package main import ( "fmt" "strings" "net/http" "io/ioutil" ) func main() { url := "https://portal.bulkgate.com/api/1.0/simple/promotional" payload := strings.NewReader("{\"application_id\": 451, \"application_token\": \"NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj\", \"number\": \"420777777777;420606606234;420601992992\", \"text\": \"Mensaje\", \"sender_id\": \"gText\", \"sender_id_value\": \"BulkGate\"}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) fmt.Println(string(body)) }

Python

python.org

# pip install requests import requests response = requests.post('https://portal.bulkgate.com/api/1.0/simple/promotional', json={ 'application_id': 451, 'application_token': 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', 'number': '420777777777;420606606234;420601992992', 'text': 'Mensaje', 'sender_id': 'gText', 'sender_id_value': 'BulkGate', }, timeout=30) data = response.json() # Una respuesta de error tiene la forma {type, code, error, detail}; consulte la tabla de tipos de error. if 'error' in data: raise RuntimeError(f"BulkGate: {data['error']} ({data['type']})") # Un envío masivo devuelve un resultado por cada número por separado. for message in data['data']['response']: if message['status'] == 'error': print(message['number'], message['error']) else: print(message['number'], message['status'], message['sms_id']) print('Resumen:', data['data']['total']['status'])

Node.js

nodejs.org

// Node.js 18+ tiene fetch de forma global. El top-level await requiere ESM (.mjs o "type": "module"). const response = await fetch('https://portal.bulkgate.com/api/1.0/simple/promotional', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ application_id: 451, application_token: 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', number: '420777777777;420606606234;420601992992', text: 'Mensaje', sender_id: 'gText', sender_id_value: 'BulkGate', }), }); const data = await response.json(); // Una respuesta de error tiene la forma {type, code, error, detail}; consulte la tabla de tipos de error. if (!response.ok) { throw new Error(`BulkGate: ${data.error} (${data.type})`); } // Un envío masivo devuelve un resultado por cada número por separado. for (const message of data.data.response) { console.log(message.status === 'error' ? `${message.number}: ${message.error}` : `${message.number}: ${message.status} (${message.sms_id})`); } console.log('Resumen:', data.data.total.status);

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/1.0/simple/promotional")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(""" { "application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777;420606606234;420601992992", "text": "Mensaje", "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", "number": "420777777777;420606606234;420601992992", "text": "Mensaje", "sender_id": "gText", "sender_id_value": "BulkGate" } """.trimIndent() val request = HttpRequest.newBuilder() .uri(URI.create("https://portal.bulkgate.com/api/1.0/simple/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", "number": "420777777777;420606606234;420601992992", "text": "Mensaje", "sender_id": "gText", "sender_id_value": "BulkGate" } """; using var client = new HttpClient(); var response = await client.PostAsync( "https://portal.bulkgate.com/api/1.0/simple/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", "number": "420777777777;420606606234;420601992992", "text": "Mensaje", "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/1.0/simple/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/1.0/simple/promotional') response = Net::HTTP.post(uri, { 'application_id' => 451, 'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', 'number' => '420777777777;420606606234;420601992992', 'text' => 'Mensaje', '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/1.0/simple/promotional \ --header 'Content-Type: application/json' \ --data '{"application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777;420606606234;420601992992", "text": "Mensaje", "sender_id": "gText", "sender_id_value": "BulkGate"}'
¿Le ha resultado útil esta página?