API de mensajería
API para programar mensajes de WhatsApp
Programa un texto, una imagen o un documento de WhatsApp para que se envíe a un número de teléfono o a un grupo en la fecha y hora que elijas. Úsala para recordatorios de citas, felicitaciones de cumpleaños, seguimientos y ofertas por tiempo limitado.
https://wbiztool.com/api/v1/schedule_msg/Cuerpo: JSON o campos de formulario
El mensaje espera en tu cola hasta la hora programada y luego se envía desde tu número de WhatsApp. La respuesta te da un msg_id que puedes usar para consultar su estado o cancelarlo.
Ejemplo rápido#
curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
"date": "24/12/2026",
"time": "09:00",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
"date": "24/12/2026",
"time": "09:00",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
print("Scheduled with msg_id", result["msg_id"])
else:
print("Failed:", result.get("message", "no message in response"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
country_code: "91",
phone: "9876543210",
msg: "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
date: "24/12/2026",
time: "09:00",
timezone: "Asia/Kolkata",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 0,
'country_code' => '91',
'phone' => '9876543210',
'msg' => 'Hi Aman, a reminder that your appointment is today at 11:30 AM.',
'date' => '24/12/2026',
'time' => '09:00',
'timezone' => 'Asia/Kolkata',
];
$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['status'] ?? 0) === 1) {
echo 'Scheduled with msg_id ' . $result['msg_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no message in response');
}Sustituye 12345, YOUR_API_KEY y 678 por tus propios valores. Consulta Autenticación para saber dónde encontrarlos.
Parámetros de la solicitud#
Autenticación
client_idintegerobligatorioTu ID de cliente de la API, de Configuración → Claves API.
api_keystringobligatorioTu clave API, de esa misma página.
whatsapp_clientintegerobligatorioID del número de WhatsApp desde el que se envía, de la configuración de WhatsApp. A diferencia de Enviar mensaje, este endpoint nunca elige un número por ti.
Programación
datestringobligatorioDía en que se envía el mensaje, con formato
dd/mm/yyyy, por ejemplo24/12/2026.timestringobligatorioHora a la que se envía el mensaje, con formato de 24 horas
HH:MM, por ejemplo09:00o18:45. No incluyas los segundos.timezonestringopcionalZona horaria en la que están
dateytime. Si lo omites, se usaIST(India). Consulta Zonas horarias.
Destinatario y mensaje
phonestringObligatorio salvo que envíes group_nameEl número de WhatsApp del destinatario, solo dígitos. Los espacios,
+,-,.y los paréntesis se eliminan automáticamente. Envía el número con su código de país (919876543210) o sin él (9876543210) junto concountry_code.group_namestringObligatorio salvo que envíes phoneNombre de un grupo de WhatsApp del que forme parte tu número. Se busca igual que en Enviar a un grupo. Envía
phoneogroup_name, nunca ambos.country_codestringopcionalCódigo telefónico del país sin
+, por ejemplo91para India o1para EE. UU. Se añade delante dephone, salvo que el número ya empiece por él. Excepción: con91, un número de 10 dígitos siempre recibe el prefijo. Con otros códigos, envía con el código de país incluido los números locales que empiecen por los mismos dígitos. Se ignora en los grupos.msg_typeintegeropcional0texto (predeterminado),1imagen,2archivo o documento.msgstringObligatorio cuando msg_type es 0Texto del mensaje. En imágenes y archivos es el pie de foto y puede estar vacío. El formato de WhatsApp funciona:
*bold*,_italic_,~strikethrough~. También se aceptamessagecomo alias.
Imágenes y archivos
img_urlstringObligatorio cuando msg_type es 1URL pública
httpohttpsde la imagen.file_urlstringObligatorio cuando msg_type es 2URL pública
httpohttpsdesde la que se puede descargar el archivo directamente.file_namestringopcionalNombre de archivo que ve el destinatario, como
invoice-4821.pdf. Se envía en minúsculas, los caracteres como& : ? * $ ;se reemplazan por_y se recorta a 150 caracteres. Si lo omites, el nombre se toma de la URL.
Opciones de entrega
webhookstringopcionalURL que recibe un
POSTcuando el mensaje se envía o falla. El contenido es el mismo que en Enviar mensaje.
Cuándo se envía el mensaje#
- Wbiztool convierte
date,timeytimezoneen un único momento y envía el mensaje en cuanto ese momento ha pasado, siempre que tu número de WhatsApp esté conectado. - Se acepta una hora en el pasado. El mensaje se envía de inmediato, como un envío normal. Revisa bien el formato de la fecha (
dd/mm/yyyy, primero el día) para no enviar un mensaje con meses de antelación. - Si tu número está desconectado a la hora programada, el mensaje espera y sale en cuanto el número se vuelve a conectar, aunque sea mucho más tarde de lo previsto. Este endpoint no tiene caducidad, así que cancela el mensaje si ya no es relevante. Un mensaje que sigue esperando en un número desconectado o eliminado 90 días después de su hora programada se elimina.
- Hasta que se envía, el mensaje tiene el estado
0(Created) y se puede cancelar. Mientras espera, también cuenta contra tus créditos restantes.
Zonas horarias#
timezone acepta un nombre de zona horaria o una de las abreviaturas siguientes.
Nombres de zona horaria, como Asia/Kolkata, America/New_York, Europe/London o Australia/Sydney. Funciona cualquier nombre de la base de datos de zonas horarias IANA. Es la opción más fiable. Consulta la Referencia de zonas horarias para ver una lista.
Abreviaturas: deben ir en mayúsculas. Cada una corresponde a una región, y el horario de verano de esa región se aplica automáticamente:
| Abreviatura | Se interpreta como |
|---|---|
IST | Asia/Kolkata |
UTC | UTC |
GMT | GMT |
EST | US/Eastern |
CST | US/Central |
MST | US/Mountain |
PST | US/Pacific |
CET, CEST | Europe/Paris |
EET, EEST | Europe/Athens |
JST | Asia/Tokyo |
AEST, AEDT | Australia/Sydney |
Por ejemplo, EST en julio significa el horario de verano de Nueva York (UTC−4), no un UTC−5 fijo.
Programar para un grupo#
curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"group_name": "Sales Team Mumbai",
"msg": "Team meeting starts in 15 minutes.",
"date": "24/12/2026",
"time": "14:45",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"group_name": "Sales Team Mumbai",
"msg": "Team meeting starts in 15 minutes.",
"date": "24/12/2026",
"time": "14:45",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
print(response.json())// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
group_name: "Sales Team Mumbai",
msg: "Team meeting starts in 15 minutes.",
date: "24/12/2026",
time: "14:45",
timezone: "Asia/Kolkata",
}),
});
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 0,
'group_name' => 'Sales Team Mumbai',
'msg' => 'Team meeting starts in 15 minutes.',
'date' => '24/12/2026',
'time' => '14:45',
'timezone' => 'Asia/Kolkata',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);Respuesta#
Una solicitud correcta devuelve HTTP 200:
{
"msg_id": 9817263,
"message": "Created",
"status": 1
}
| Campo | Tipo | Descripción |
|---|---|---|
status | integer | 1 si el mensaje se programó, 0 si la solicitud falló. |
message | string | Created si todo va bien; en caso contrario, el error. |
msg_id | integer | ID del mensaje programado. Guárdalo para consultar el estado o cancelarlo más adelante. Solo aparece si la solicitud es correcta. |
La respuesta no repite la hora ni la zona horaria programadas, así que registra lo que enviaste.
Errores#
La mayoría de los errores devuelven HTTP 200 con status con valor 0, así que revisa siempre status en el cuerpo:
{ "message": "Scheduled date & time is not in valid format", "status": 0 }
| Mensaje | Cómo solucionarlo |
|---|---|
Auth Error | Envía client_id y api_key. |
Invalid Client Id | Envía client_id como número. Se devuelve con HTTP 403. |
Auth Error: invalid api key | Comprueba que la clave existe, que no se ha eliminado y que pertenece a este client_id. Se devuelve con HTTP 400. |
Either phone or group_name parameter is required | Añade phone o group_name. |
Please provide either phone OR group_name, not both | Elimina uno de los dos. |
Invalid phone number | phone solo debe contener dígitos (entre 6 y 17), opcionalmente precedidos de +. |
Invalid Contact Number "…" | Con el código de país añadido, el número debe tener entre 6 y 15 dígitos. |
Msg cant be null | Los mensajes de texto (msg_type 0) necesitan msg. |
Image Url Can't be null | Para msg_type 1, envía img_url. |
File Url Can't be null | Para msg_type 2, envía file_url. |
Scheduled date & time is not in valid format | Falta date o time, o timezone es una cadena vacía. |
Not enough credits | Tu plan no tiene mensajes disponibles. |
Demo Account can not access apis | Usa una cuenta normal. |
Invalid JSON format: … | El cuerpo JSON no es válido, o enviaste campos de formulario sin client_id. |
Consejos#
-
Construye la fecha con cuidado: en Python usa
strftime("%d/%m/%Y")ystrftime("%H:%M"). En JavaScript, da formato a la fecha y la hora en la misma zona horaria que envías entimezone, no en la hora local de tu servidor:const tz = "Asia/Kolkata"; // d is the Date to send at const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(d); // "24/12/2026" const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(d); // "09:00" -
Confirma la hora: programa un mensaje de prueba cinco minutos más tarde y comprueba que llega cuando esperas.
-
Cambio de planes: para reprogramar, cancela el mensaje y programa uno nuevo.
-
Por ahora, no uses los clientes oficiales para programar:
schedule_messagede Python envía la fecha comoYYYY-MM-DD(la respuesta es{}), yscheduleMessagede Node envíaschedule_time, que este endpoint no lee. Llama directamente al endpoint como se muestra arriba. -
Mensajes recurrentes: para mensajes que se repiten, como recordatorios de pago mensuales, consulta Crear recordatorio.
