Guia completa para enviar mensajes SMS individuales y masivos a traves de la API REST.
La API de WhatsBoost ofrece dos endpoints para el envio de SMS:
| Tipo | Endpoint | Descripcion |
|---|---|---|
| Individual | POST /api/send/sms |
Envia un unico SMS a un destinatario. Ideal para notificaciones, alertas y confirmaciones. |
| Masivo | POST /api/send/sms.bulk |
Envia SMS a multiples destinatarios creando una campana. Ideal para marketing, avisos y comunicaciones grupales. |
Cada endpoint soporta dos modos de envio fundamentalmente diferentes. Debes elegir uno en cada peticion mediante el parametro mode:
devices — Dispositivo AndroidTu telefono Android vinculado actua como pasarela de envio. El SMS sale directamente desde la tarjeta SIM del dispositivo, como si lo enviaras manualmente.
device (ID del dispositivo).credits — Pasarela SMS / CreditosEl SMS se envia a traves de una pasarela SMS profesional (Twilio, Vonage, etc.) o a traves de un dispositivo global de un partner. Se descuentan creditos de tu saldo.
gateway (ID de la pasarela o nombre del dispositivo partner).sms + sms_send en tu API Key. Para envio masivo necesitas sms + sms_send_bulk. Consulta la tabla de permisos para mas detalles.
POST /api/send/smsEnvia un unico mensaje SMS a un destinatario. La URL completa del endpoint es:
POST //whatsboost.netapi/send/sms
| Parametro | Tipo | Estado | Descripcion |
|---|---|---|---|
secret |
string |
Obligatorio | Tu API Key de 40 caracteres. Consulta la guia de autenticacion. |
phone |
string |
Obligatorio | Numero de telefono del destinatario en formato internacional E.164. Debe incluir el codigo de pais sin el signo +. Ejemplos: 34612345678 (Espana), 5215512345678 (Mexico), 573001234567 (Colombia). El sistema valida automaticamente que el numero sea un movil valido. |
message |
string |
Obligatorio | Texto del mensaje SMS. Soporta spintax para variaciones automaticas (ver mas abajo). La longitud minima y maxima esta configurada por el sistema. Los mensajes pueden ser revisados por moderacion automatica con IA si esta activada en el sistema. |
mode |
string |
Obligatorio | Modo de envio. Valores posibles: devices (envio a traves de tu dispositivo Android) o credits (envio a traves de pasarela SMS/creditos). |
device |
string |
Condicional | Obligatorio si mode=devices. Identificador unico del dispositivo Android (DID). Lo encuentras en Dashboard > Dispositivos. Es un hash unico asignado al vincular tu telefono. |
gateway |
string|int |
Condicional | Obligatorio si mode=credits. Puede ser un numero entero (ID de la pasarela SMS configurada por el administrador) o una cadena de texto (nombre del dispositivo global de un partner). Consulta los gateways disponibles con el endpoint /api/get/rates. |
sim |
int |
Opcional | Ranura SIM a utilizar. Solo aplica cuando mode=devices. Valores: 1 (SIM 1, por defecto) o 2 (SIM 2). Si el dispositivo no es dual SIM, usa 1. |
priority |
int |
Opcional | Prioridad del mensaje. 1 = alta (envio inmediato, se salta la cola), 2 = normal (entra en la cola de envio). Por defecto: 1 (alta). Solo aplica cuando mode=devices. |
shortener |
int |
Opcional | ID del servicio de acortamiento de URL. Si se proporciona, todas las URLs detectadas en el mensaje seran acortadas automaticamente antes del envio. Consulta los shorteners disponibles con /api/get/shorteners. |
El sistema soporta spintax, una sintaxis que permite definir variantes de texto separadas por el caracter | dentro de llaves. El sistema elige una variante aleatoria en cada envio, lo que hace que cada mensaje sea ligeramente diferente. Esto es util para evitar filtros de spam y para personalizar comunicaciones.
| Spintax en el mensaje | Posibles resultados |
|---|---|
{Hola|Buenos dias|Hey} Juan |
"Hola Juan", "Buenos dias Juan", "Hey Juan" |
Tu pedido {esta listo|ha sido preparado} |
"Tu pedido esta listo", "Tu pedido ha sido preparado" |
{Gracias|Muchas gracias} por tu {compra|pedido} |
4 combinaciones posibles: "Gracias por tu compra", "Muchas gracias por tu pedido", etc. |
El parametro phone debe contener el numero en formato internacional, incluyendo el codigo de pais. No incluyas el signo +, espacios ni guiones. El sistema valida automaticamente que sea un numero de telefono movil valido.
| Pais | Codigo | Ejemplo local | Formato para la API |
|---|---|---|---|
| Espana | +34 | 612 345 678 | 34612345678 |
| Mexico | +52 | 55 1234 5678 | 5215512345678 |
| Colombia | +57 | 300 123 4567 | 573001234567 |
| Argentina | +54 | 11 1234 5678 | 541112345678 |
| Estados Unidos | +1 | (555) 123-4567 | 15551234567 |
| Reino Unido | +44 | 7911 123456 | 447911123456 |
El sistema aplica validaciones automaticas al contenido del mensaje:
400.400 y se registraran en el log de moderacion.devices, tu suscripcion tiene un limite maximo de mensajes enviados. Si alcanzas el limite, recibiras un error 403. En modo credits, necesitas tener suficientes creditos para cubrir el coste del mensaje segun el pais destino.
# Envio con modo dispositivo Android
curl -X POST //whatsboost.netapi/send/sms \
-d "secret=TU_API_KEY" \
-d "phone=34612345678" \
-d "message=Hola, tu pedido #1234 esta listo para recoger." \
-d "mode=devices" \
-d "device=TU_DEVICE_ID" \
-d "sim=1" \
-d "priority=1"
# Envio con modo creditos/pasarela
curl -X POST //whatsboost.netapi/send/sms \
-d "secret=TU_API_KEY" \
-d "phone=34612345678" \
-d "message=Hola, tu pedido #1234 esta listo para recoger." \
-d "mode=credits" \
-d "gateway=1"
<?php
$apiKey = getenv("WHATSBOOST_API_KEY");
$baseUrl = "//whatsboost.netapi/send/sms";
// --- Modo dispositivo ---
$params = [
"secret" => $apiKey,
"phone" => "34612345678",
"message" => "Hola, tu pedido #1234 esta listo para recoger.",
"mode" => "devices",
"device" => "TU_DEVICE_ID",
"sim" => 1,
"priority" => 1
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $baseUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "SMS enviado. ID: " . $data["data"]["messageId"];
} else {
echo "Error ({$httpCode}): " . $data["message"];
}
const API_KEY = process.env.WHATSBOOST_API_KEY;
const BASE_URL = "//whatsboost.netapi/send/sms";
// --- Modo dispositivo ---
const params = new URLSearchParams({
secret: API_KEY,
phone: "34612345678",
message: "Hola, tu pedido #1234 esta listo para recoger.",
mode: "devices",
device: "TU_DEVICE_ID",
sim: "1",
priority: "1"
});
const response = await fetch(BASE_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: params
});
const data = await response.json();
if (response.ok) {
console.log("SMS enviado. ID:", data.data.messageId);
} else {
console.error("Error (" + response.status + "):", data.message);
}
import os
import requests
API_KEY = os.environ["WHATSBOOST_API_KEY"]
BASE_URL = "//whatsboost.netapi/send/sms"
# --- Modo dispositivo ---
params = {
"secret": API_KEY,
"phone": "34612345678",
"message": "Hola, tu pedido #1234 esta listo para recoger.",
"mode": "devices",
"device": "TU_DEVICE_ID",
"sim": 1,
"priority": 1
}
response = requests.post(BASE_URL, data=params)
data = response.json()
if response.status_code == 200:
print("SMS enviado. ID:", data["data"]["messageId"])
else:
print("Error (" + str(response.status_code) + "):", data["message"])
{
"status": 200,
"message": "Message has been queued for sending!",
"data": {
"messageId": 48291
}
}
El campo messageId es un identificador unico que puedes usar posteriormente para consultar el estado del mensaje con el endpoint /api/get/message.
POST /api/send/sms.bulkEnvia SMS a multiples destinatarios de forma simultanea, creando una campana que puedes monitorizar y controlar desde el Dashboard o via API. La URL completa del endpoint es:
POST //whatsboost.netapi/send/sms.bulk
| Parametro | Tipo | Estado | Descripcion |
|---|---|---|---|
secret |
string |
Obligatorio | Tu API Key de 40 caracteres. |
campaign |
string |
Obligatorio | Nombre de la campana. Sera visible en el Dashboard para su seguimiento. Usa un nombre descriptivo, por ejemplo: "Promo Navidad 2025", "Recordatorio citas diciembre". |
message |
string |
Obligatorio | Texto del mensaje SMS. Soporta spintax y variables de plantilla (ver mas abajo). Las mismas validaciones de longitud y moderacion IA aplican. |
mode |
string |
Obligatorio | Modo de envio: devices o credits. Funciona igual que en envio individual. |
device |
string |
Condicional | Obligatorio si mode=devices. ID del dispositivo Android (DID). |
gateway |
string|int |
Condicional | Obligatorio si mode=credits. ID numerico de la pasarela o nombre del dispositivo global del partner. |
numbers |
string |
Condicional | Lista de numeros de telefono separados por comas, en formato internacional E.164. Ejemplo: 34612345678,5215512345678,573001234567. Debes proporcionar numbers y/o groups. |
groups |
string |
Condicional | Lista de IDs de grupos de contactos separados por comas. Ejemplo: 5,12,28. El sistema enviara el mensaje a todos los contactos de esos grupos. Debes proporcionar numbers y/o groups. |
sim |
int |
Opcional | Ranura SIM: 1 (defecto) o 2. Solo aplica con mode=devices. |
priority |
int |
Opcional | Prioridad: 1 = alta, 2 = normal. Solo aplica con mode=devices. |
shortener |
int |
Opcional | ID del servicio de acortamiento de URL. Las URLs del mensaje se acortan antes del envio. |
En el envio masivo, puedes usar variables dinamicas que se reemplazan automaticamente con los datos de cada contacto. Esto permite personalizar cada mensaje individual dentro de la campana:
| Variable | Descripcion | Ejemplo de salida |
|---|---|---|
{{contact.name}} |
Nombre del contacto (si proviene de un grupo de contactos). Para numeros manuales, sera el propio numero. | Juan Garcia |
{{contact.number}} |
Numero de telefono del destinatario en formato E.164. | +34612345678 |
{{group.name}} |
Nombre del grupo al que pertenece el contacto. "Unknown" si se envio por numero directo. | Clientes VIP |
{{date.now}} |
Fecha actual en formato legible (mes dia, ano). Usa la zona horaria del usuario. | March 22, 2026 |
{{date.time}} |
Hora actual en formato 12h. Usa la zona horaria del usuario. | 02:30 PM |
Ejemplo de mensaje con variables y spintax:
{Hola|Buenos dias} {{contact.name}}, te recordamos tu cita del {{date.now}}.
Grupo: {{group.name}}. Responde STOP para darte de baja.
# Envio masivo por numeros directos (modo dispositivo)
curl -X POST //whatsboost.netapi/send/sms.bulk \
-d "secret=TU_API_KEY" \
-d "campaign=Promo Verano 2026" \
-d "message={Hola|Hey} {{contact.name}}, aprovecha un 20%% de descuento hoy." \
-d "mode=devices" \
-d "device=TU_DEVICE_ID" \
-d "sim=1" \
-d "priority=2" \
-d "numbers=34612345678,34698765432,5215512345678"
# Envio masivo por grupos (modo creditos)
curl -X POST //whatsboost.netapi/send/sms.bulk \
-d "secret=TU_API_KEY" \
-d "campaign=Recordatorio Citas Marzo" \
-d "message=Hola {{contact.name}}, recuerda tu cita de manana." \
-d "mode=credits" \
-d "gateway=1" \
-d "groups=5,12"
<?php
$apiKey = getenv("WHATSBOOST_API_KEY");
$baseUrl = "//whatsboost.netapi/send/sms.bulk";
$params = [
"secret" => $apiKey,
"campaign" => "Promo Verano 2026",
"message" => "{Hola|Hey} {{contact.name}}, aprovecha un 20% hoy.",
"mode" => "devices",
"device" => "TU_DEVICE_ID",
"sim" => 1,
"priority" => 2,
"numbers" => "34612345678,34698765432,5215512345678"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $baseUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Campana creada: " . $data["message"];
} else {
echo "Error ({$httpCode}): " . $data["message"];
}
const API_KEY = process.env.WHATSBOOST_API_KEY;
const BASE_URL = "//whatsboost.netapi/send/sms.bulk";
const params = new URLSearchParams({
secret: API_KEY,
campaign: "Promo Verano 2026",
message: "{Hola|Hey} {{contact.name}}, aprovecha un 20% hoy.",
mode: "devices",
device: "TU_DEVICE_ID",
sim: "1",
priority: "2",
numbers: "34612345678,34698765432,5215512345678"
});
const response = await fetch(BASE_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: params
});
const data = await response.json();
if (response.ok) {
console.log("Campana creada:", data.message);
} else {
console.error("Error (" + response.status + "):", data.message);
}
import os
import requests
API_KEY = os.environ["WHATSBOOST_API_KEY"]
BASE_URL = "//whatsboost.netapi/send/sms.bulk"
params = {
"secret": API_KEY,
"campaign": "Promo Verano 2026",
"message": "{Hola|Hey} {{contact.name}}, aprovecha un 20% hoy.",
"mode": "devices",
"device": "TU_DEVICE_ID",
"sim": 1,
"priority": 2,
"numbers": "34612345678,34698765432,5215512345678"
}
response = requests.post(BASE_URL, data=params)
data = response.json()
if response.status_code == 200:
print("Campana creada:", data["message"])
else:
print("Error (" + str(response.status_code) + "):", data["message"])
{
"status": 200,
"message": "Bulk messages has been queued for sending!"
}
A diferencia del envio individual, la respuesta masiva no incluye un messageId por cada mensaje. Se crea una campana que puedes consultar con el endpoint /api/get/sms.campaigns y ver el progreso de envio de cada mensaje individual.
Una vez creada una campana masiva, puedes pausarla y reanudarla de forma remota sin necesidad de acceder al Dashboard. Esto es util para automatizaciones que necesitan detener temporalmente el envio (por ejemplo, fuera de horario comercial).
devices. Las campanas enviadas a traves de pasarelas con gateway numerico no soportan pausa/reanudacion porque los mensajes se procesan de forma instantanea.
POST /api/remote/start.smsReanuda una campana SMS que esta actualmente pausada. Requiere el permiso start_sms_campaign.
| Parametro | Tipo | Estado | Descripcion |
|---|---|---|---|
secret |
string |
Obligatorio | Tu API Key. |
campaign |
int |
Obligatorio | ID numerico de la campana a reanudar. Lo obtienes al consultar /api/get/sms.campaigns. |
curl -X POST //whatsboost.netapi/remote/start.sms \
-d "secret=TU_API_KEY" \
-d "campaign=142"
Respuesta:
{
"status": 200,
"message": "SMS campaign has been resumed!"
}
POST /api/remote/stop.smsPausa una campana SMS que esta actualmente activa/en proceso. Requiere el permiso stop_sms_campaign. Los mensajes que ya estan en cola en el dispositivo podrian seguir enviandose hasta que la app procese la senal de pausa.
| Parametro | Tipo | Estado | Descripcion |
|---|---|---|---|
secret |
string |
Obligatorio | Tu API Key. |
campaign |
int |
Obligatorio | ID numerico de la campana a pausar. |
curl -X POST //whatsboost.netapi/remote/stop.sms \
-d "secret=TU_API_KEY" \
-d "campaign=142"
Respuesta:
{
"status": 200,
"message": "SMS campaign has been paused!"
}
Comprender el ciclo de vida de un SMS te ayudara a depurar problemas y a entender los estados que veras en el Dashboard y en los webhooks.
devices (dispositivo Android)pending (1). Si la prioridad es alta (1), el dispositivo lo procesara de inmediato.credits (pasarela SMS)403.| Codigo | Estado | Descripcion |
|---|---|---|
1 |
Pending | El mensaje esta en cola, esperando ser procesado por el dispositivo o la pasarela. |
2 |
Sent | El mensaje ha sido enviado pero aun no se ha confirmado la entrega al destinatario. |
3 |
Delivered | El mensaje fue entregado correctamente al telefono del destinatario. |
4 |
Failed | El envio fallo. Posibles causas: numero invalido, dispositivo sin cobertura, pasarela con error, etc. |
| Codigo | Mensaje | Solucion |
|---|---|---|
400 |
Invalid Parameters! | Faltan parametros obligatorios o tienen formato incorrecto. Verifica que envias secret, phone, message y mode. |
400 |
Invalid phone number! | El numero no es un movil valido. Asegurate de incluir el codigo de pais y que sea un numero real. |
400 |
Message is too short! | El mensaje no alcanza la longitud minima configurada en el sistema. |
400 |
Message is too long! | El mensaje supera la longitud maxima permitida. Reducelo antes de reenviar. |
400 |
We detected inappropriate content in your message! | La moderacion IA ha detectado contenido inapropiado. Revisa y modifica el texto del mensaje. |
401 |
Invalid API secret supplied! | La API Key no existe o fue eliminada. Verifica que estas usando la key correcta. |
403 |
This API key doesn't have permission... | Tu API Key no tiene el permiso sms_send o sms_send_bulk. Edita los permisos desde el Dashboard. |
403 |
Subscription has no permission to use SMS services! | Tu plan de suscripcion no incluye el servicio de SMS. Actualiza tu suscripcion. |
403 |
Maximum allowed number of sent messages has been reached! | Has alcanzado el limite de envio de tu suscripcion. Espera al siguiente periodo o actualiza tu plan. |
403 |
Not enough credits to send this message! | Tu saldo de creditos es insuficiente para el coste del mensaje al pais destino. Recarga creditos. |
403 |
Account is not subscribed to any premium package! | No tienes suscripcion activa (necesaria para modo devices). Contrata un plan premium. |
404 |
Device doesn't exist! | El device ID proporcionado no pertenece a tu cuenta o no existe. Verificalo en Dashboard > Dispositivos. |
404 |
Specified gateway doesn't exist! | El ID de pasarela proporcionado no existe en el sistema. Consulta las pasarelas disponibles con /api/get/rates. |
500 |
Gateway was unable to send your message! | La pasarela externa fallo al procesar el envio. Reintenta despues o prueba con otra pasarela. |
Para una referencia completa de todos los codigos de error de la API, consulta la seccion Errores y estados.
Copia y pega este prompt en ChatGPT, Claude, Gemini o tu asistente de IA favorito para que te ayude a implementar el envio de SMS en tu proyecto.
Eres un desarrollador backend experto. Necesito integrar el envio de SMS
usando la API de WhatsBoost. Estos son los detalles tecnicos:
ENVIO INDIVIDUAL:
- Endpoint: POST //whatsboost.netapi/send/sms
- Parametros obligatorios: secret (API Key), phone (E.164), message, mode
- mode=devices: requiere "device" (DID del Android). Opcional: sim (1|2), priority (1|2)
- mode=credits: requiere "gateway" (int ID o string nombre partner)
- Opcional: shortener (int, ID del acortador de URLs)
- Respuesta exitosa: {"status":200, "message":"...", "data":{"messageId":INT}}
ENVIO MASIVO:
- Endpoint: POST //whatsboost.netapi/send/sms.bulk
- Parametros adicionales: campaign (nombre), numbers (comas) y/o groups (IDs comas)
- Variables de plantilla: {{contact.name}}, {{contact.number}}, {{group.name}}, {{date.now}}, {{date.time}}
- Soporta spintax: {opcion1|opcion2|opcion3}
CONTROL DE CAMPANAS:
- POST /api/remote/start.sms (secret + campaign ID) - reanudar
- POST /api/remote/stop.sms (secret + campaign ID) - pausar
Ayudame a:
1. Crear funciones para envio individual y masivo con manejo de errores.
2. Implementar validacion de numeros E.164 antes de enviar.
3. Crear una cola de reintentos para errores transitorios (500).
4. Integrar con [MI CASO DE USO: e-commerce / CRM / chatbot / etc.]
Mi stack tecnologico es: [INDICA TU STACK AQUI]