Saltar al contenido
Wbiztool

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.

POSThttps://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"
  }'

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_idintegerobligatorio

Tu ID de cliente de la API, de Configuración → Claves API.

api_keystringobligatorio

Tu clave API, de esa misma página.

whatsapp_clientintegerobligatorio

ID 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

datestringobligatorio

Día en que se envía el mensaje, con formato dd/mm/yyyy, por ejemplo 24/12/2026.

timestringobligatorio

Hora a la que se envía el mensaje, con formato de 24 horas HH:MM, por ejemplo 09:00 o 18:45. No incluyas los segundos.

timezonestringopcional

Zona horaria en la que están date y time. Si lo omites, se usa IST (India). Consulta Zonas horarias.

Destinatario y mensaje

phonestringObligatorio salvo que envíes group_name

El 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 con country_code.

group_namestringObligatorio salvo que envíes phone

Nombre de un grupo de WhatsApp del que forme parte tu número. Se busca igual que en Enviar a un grupo. Envía phone o group_name, nunca ambos.

country_codestringopcional

Código telefónico del país sin +, por ejemplo 91 para India o 1 para EE. UU. Se añade delante de phone, salvo que el número ya empiece por él. Excepción: con 91, 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_typeintegeropcional

0 texto (predeterminado), 1 imagen, 2 archivo o documento.

msgstringObligatorio cuando msg_type es 0

Texto 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 acepta message como alias.

Imágenes y archivos

img_urlstringObligatorio cuando msg_type es 1

URL pública http o https de la imagen.

file_urlstringObligatorio cuando msg_type es 2

URL pública http o https desde la que se puede descargar el archivo directamente.

file_namestringopcional

Nombre 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

webhookstringopcional

URL que recibe un POST cuando 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, time y timezone en 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:

AbreviaturaSe interpreta como
ISTAsia/Kolkata
UTCUTC
GMTGMT
ESTUS/Eastern
CSTUS/Central
MSTUS/Mountain
PSTUS/Pacific
CET, CESTEurope/Paris
EET, EESTEurope/Athens
JSTAsia/Tokyo
AEST, AEDTAustralia/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"
  }'

Respuesta#

Una solicitud correcta devuelve HTTP 200:

{
  "msg_id": 9817263,
  "message": "Created",
  "status": 1
}
CampoTipoDescripción
statusinteger1 si el mensaje se programó, 0 si la solicitud falló.
messagestringCreated si todo va bien; en caso contrario, el error.
msg_idintegerID 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 }
MensajeCómo solucionarlo
Auth ErrorEnvía client_id y api_key.
Invalid Client IdEnvía client_id como número. Se devuelve con HTTP 403.
Auth Error: invalid api keyComprueba 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 requiredAñade phone o group_name.
Please provide either phone OR group_name, not bothElimina uno de los dos.
Invalid phone numberphone 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 nullLos mensajes de texto (msg_type 0) necesitan msg.
Image Url Can't be nullPara msg_type 1, envía img_url.
File Url Can't be nullPara msg_type 2, envía file_url.
Scheduled date & time is not in valid formatFalta date o time, o timezone es una cadena vacía.
Not enough creditsTu plan no tiene mensajes disponibles.
Demo Account can not access apisUsa 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") y strftime("%H:%M"). En JavaScript, da formato a la fecha y la hora en la misma zona horaria que envías en timezone, 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_message de Python envía la fecha como YYYY-MM-DD (la respuesta es {}), y scheduleMessage de Node envía schedule_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.