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/promotionalHTTP/1.1Host: 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/promotionalHTTP/1.1Host: 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/promotionalHTTP/1.1Host: 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/promotionalHTTP/1.1Host: 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"}
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:
# pip install requestsimport 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 18+ tiene fetch de forma global. El top-level await requiere ESM (.mjs o "type": "module").const response = awaitfetch('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) {
thrownewError(`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);