API de recordatorios
API para crear un recordatorio
Crea un mensaje de WhatsApp recurrente que se envía automáticamente según una programación. Úsala para recordatorios de pago, seguimientos semanales o diarios y otros mensajes que se repiten.
https://wbiztool.com/api/v1/reminder/create/Cuerpo: JSON o campos de formulario
Describes la programación con una expresión cron y una zona horaria. Cada vez que se cumple la programación, Wbiztool pone en cola un mensaje para el número de teléfono o el grupo, igual que un mensaje enviado con Enviar mensaje. Los recordatorios que creas aquí también aparecen en la página de Recordatorios de tu panel, donde puedes pausarlos o editarlos.
Ejemplo rápido#
curl -X POST https://wbiztool.com/api/v1/reminder/create/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Monthly rent reminder",
"phone": "919876543210",
"message": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"cron_expression": "0 10 1 * *",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/create/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Monthly rent reminder",
"phone": "919876543210",
"message": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"cron_expression": "0 10 1 * *",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
try:
result = response.json() # read the body even when the HTTP code is 400
except ValueError:
raise SystemExit(f"HTTP {response.status_code}: not JSON. Check that your api_key exists.")
if result["status"] == 1:
print("Reminder created with reminder_id", result["reminder_id"])
else:
print("Failed:", result["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/reminder/create/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
reminder_name: "Monthly rent reminder",
phone: "919876543210",
message: "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
cron_expression: "0 10 1 * *",
timezone: "Asia/Kolkata",
}),
});
// Read the body even when the HTTP code is 400. A non-JSON reply means the api_key wasn't found.
const text = await response.text();
let result;
try {
result = JSON.parse(text);
} catch {
throw new Error(`HTTP ${response.status}: not JSON. Check that your api_key exists.`);
}
if (result.status === 1) {
console.log("Reminder created with reminder_id", result.reminder_id);
} else {
console.error("Failed:", result.message);
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'reminder_name' => 'Monthly rent reminder',
'phone' => '919876543210',
'message' => 'Hi Aman, a reminder that your rent is due on {current_date_formatted}.',
'cron_expression' => '0 10 1 * *',
'timezone' => 'Asia/Kolkata',
];
$ch = curl_init('https://wbiztool.com/api/v1/reminder/create/');
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);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($result === null) {
echo "HTTP $httpCode: not JSON. Check that your api_key exists.";
} elseif ($result['status'] === 1) {
echo 'Reminder created with reminder_id ' . $result['reminder_id'];
} else {
echo 'Failed: ' . $result['message'];
}Este recordatorio se envía a las 10:00, hora de India, el día 1 de cada mes. Sustituye 12345, YOUR_API_KEY y 678 por tus propios valores. Consulta Autenticación para saber dónde encontrarlos.
Parámetros de la solicitud#
Envía los parámetros como cuerpo JSON o como campos de formulario. En JSON, envía todos los valores de texto (api_key, reminder_name, phone, message, cron_expression, timezone, img_url, file_name) como cadenas.
Autenticación
client_idintegerobligatorioTu ID de cliente de la API, de Configuración → Claves API.
api_keystringobligatorioTu clave API, de esa misma página.
Remitente
whatsapp_clientintegeropcionalID del número de WhatsApp desde el que se envía, de la configuración de WhatsApp. Si lo omites, o si el ID no está en tu espacio de trabajo, cada recordatorio se envía desde el primer número conectado de tu espacio de trabajo en el momento en que se ejecuta.
Recordatorio
reminder_namestringobligatorioUn nombre para el recordatorio, que se muestra en la página de Recordatorios y está disponible en el mensaje como
{reminder_name}.phonestringobligatorioEl número de WhatsApp del destinatario con su código de país, por ejemplo
919876543210. No hay un parámetrocountry_codeaparte. Se eliminan los espacios,+,-,.y los paréntesis, y también un0inicial (hasta dos ceros iniciales en un cuerpo JSON). Un valor que no esté formado solo por dígitos se trata como nombre de un grupo de WhatsApp.messagestringobligatorioEl texto del mensaje. Puede incluir variables de plantilla que se rellenan cada vez que se ejecuta el recordatorio. El formato de WhatsApp funciona:
*bold*,_italic_,~strikethrough~.cron_expressionstringobligatorioCuándo enviar, como expresión cron de cinco campos, por ejemplo
0 9 * * 1-5. Consulta Expresiones cron.timezonestringopcionalLa zona horaria en la que se ejecuta la expresión cron, como nombre de zona horaria IANA, por ejemplo
Asia/Kolkata,America/New_YorkoEurope/London. Omítelo para usarUTC. Una cadena vacía devuelveInvalid timezone. Consulta la Referencia de zonas horarias para ver la lista completa.
Imágenes y archivos
msg_typeintegeropcional0texto (predeterminado),1imagen o2archivo, conmessagecomo pie de foto. Cualquier otro valor se trata como0.img_urlstringObligatorio cuando msg_type es 1 o 2URL pública
httpohttpsde la imagen, o del archivo simsg_typees 2, de hasta 1.000 caracteres. Se descarga cada vez que se ejecuta el recordatorio, así que mantén el enlace activo. Puedes alojar archivos con la API de subida de medios.file_namestringObligatorio cuando msg_type es 2Para
msg_type2, el nombre del archivo con su extensión, de hasta 100 caracteres, por ejemploinvoice.pdf. Se ignora en los demás tipos de mensaje.
Expresiones cron#
Una expresión cron son cinco valores separados por espacios. El recordatorio se ejecuta siempre que la hora actual en timezone coincide con los cinco:
┌───────── minute (0-59)
│ ┌─────── hour (0-23)
│ │ ┌───── day of month (1-31)
│ │ │ ┌─── month (1-12)
│ │ │ │ ┌─ day of week (0-7, where 0 and 7 are Sunday)
│ │ │ │ │
0 9 * * 1-5
| Símbolo | Significado | Ejemplo |
|---|---|---|
* | Todos los valores | * en el campo de la hora significa cada hora. |
, | Una lista de valores | 9,18 en el campo de la hora significa a las 9:00 y a las 18:00. |
- | Un rango | 1-5 en el campo del día de la semana significa de lunes a viernes. |
/ | Un intervalo | */6 en el campo de la hora significa cada 6 horas. |
Ejemplos habituales#
| Expresión | Se ejecuta |
|---|---|
0 9 * * * | Todos los días a las 9:00 |
0 9 * * 1-5 | De lunes a viernes a las 9:00 |
0 9 * * 1 | Todos los lunes a las 9:00 |
30 18 * * 0 | Todos los domingos a las 18:30 |
0 9,18 * * * | Todos los días a las 9:00 y a las 18:00 |
0 */6 * * * | Cada 6 horas, en punto |
*/30 9-17 * * 1-5 | Cada 30 minutos de 9:00 a 17:30, de lunes a viernes |
0 9 1 * * | El día 1 de cada mes a las 9:00 |
0 10 15 * * | El día 15 de cada mes a las 10:00 |
0 8 1 1 * | Cada 1 de enero a las 8:00 |
Las horas están en la timezone del recordatorio. Usa solo cinco campos: no añadas un campo de segundos ni atajos como @daily.
Variables de plantilla#
Estos marcadores de message se sustituyen cada vez que se ejecuta el recordatorio. Las fechas y horas están en la timezone del recordatorio.
| Variable | Se sustituye por | Ejemplo |
|---|---|---|
{current_date} | Fecha | 2026-10-01 |
{current_date_formatted} | Fecha en palabras, con el día rellenado con un cero | October 01, 2026 |
{current_time} | Hora en formato de 24 horas | 09:00:00 |
{current_time_12h} | Hora en formato de 12 horas | 09:00 AM |
{current_datetime} | Fecha y hora | 2026-10-01 09:00:00 |
{timezone} | El valor de timezone | Asia/Kolkata |
{timezone_short} | Abreviatura de la zona horaria | IST |
{reminder_name} | El valor de reminder_name | Monthly rent reminder |
{to_number} | El valor guardado de phone | 919876543210 |
{client_name} | Nombre del propietario del espacio de trabajo | |
{organisation_name} | Nombre de tu espacio de trabajo |
Recordatorio con imagen#
curl -X POST https://wbiztool.com/api/v1/reminder/create/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Weekly class timetable",
"phone": "919876543210",
"msg_type": 1,
"img_url": "https://example.com/timetable.png",
"message": "Here is this week'\''s timetable.",
"cron_expression": "0 8 * * 1",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/create/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Weekly class timetable",
"phone": "919876543210",
"msg_type": 1,
"img_url": "https://example.com/timetable.png",
"message": "Here is this week's timetable.",
"cron_expression": "0 8 * * 1",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
print(response.status_code, response.text)// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/reminder/create/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
reminder_name: "Weekly class timetable",
phone: "919876543210",
msg_type: 1,
img_url: "https://example.com/timetable.png",
message: "Here is this week's timetable.",
cron_expression: "0 8 * * 1",
timezone: "Asia/Kolkata",
}),
});
console.log(response.status, await response.text());<?php
$ch = curl_init('https://wbiztool.com/api/v1/reminder/create/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'reminder_name' => 'Weekly class timetable',
'phone' => '919876543210',
'msg_type' => 1,
'img_url' => 'https://example.com/timetable.png',
'message' => "Here is this week's timetable.",
'cron_expression' => '0 8 * * 1',
'timezone' => 'Asia/Kolkata',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);El ejemplo de PHP envía campos de formulario en lugar de JSON. Las dos opciones funcionan.
Respuesta#
Una solicitud correcta devuelve HTTP 200:
{
"reminder_id": 3187,
"message": "Reminder created successfully",
"status": 1
}
| Campo | Tipo | Descripción |
|---|---|---|
status | integer | 1 si se creó el recordatorio, 0 si la solicitud falló. |
message | string | Reminder created successfully; en caso contrario, el error. |
reminder_id | integer | ID del nuevo recordatorio. Guárdalo para cancelar el recordatorio más adelante. Solo aparece si la solicitud es correcta. |
Los recordatorios nuevos están activos de inmediato.
Errores#
Los errores devuelven HTTP 400 con status con valor 0, salvo que se indique lo contrario:
{ "status": 0, "message": "Invalid timezone" }
| Mensaje | Cómo solucionarlo |
|---|---|
Invalid JSON format: … | El cuerpo JSON no es válido, a menudo por una coma final o un salto de línea sin escapar en message. Usa \n para los saltos de línea. También recibes este error en una solicitud de formulario sin client_id o en cualquier solicitud GET. |
Invalid client id. | Envía client_id como número. |
Reminder name cannot be null | Añade reminder_name. |
Phone number cannot be null | Añade phone. |
Message template cannot be null | Añade message. |
Cron expression cannot be null | Añade cron_expression. |
Auth Error - Please send correct API key and Client id | Envía un api_key que no esté vacío. |
Invalid cron expression | Comprueba que la expresión tenga cinco campos válidos. Consulta Expresiones cron. |
Invalid timezone | Usa un nombre IANA como Asia/Kolkata, no una abreviatura como IST. |
Image URL cannot be null for image messages | Para msg_type 1, envía img_url. |
File URL cannot be null for file messages | Para msg_type 2, envía file_name. |
Auth Error: invalid api key | La clave pertenece a otro client_id. |
Auth Error: please check client id | La clave no está vinculada a ningún espacio de trabajo. Crea una clave nueva en el espacio de trabajo que quieras usar. |
Demo Account cannot access APIs | Usa una cuenta normal. |
Not enough credits | Tu plan no tiene mensajes disponibles. |
Upgrade your plan to use reminders feature | Tu plan no incluye recordatorios. Mejora tu plan. |
WhatsApp Logged Out. Please Reconnect!! | El número de whatsapp_client está desconectado. Vuelve a conectarlo en la configuración de WhatsApp. |
Invalid WhatsApp client id | Envía whatsapp_client como número. |
Error creating reminder: … (HTTP 500) | No se pudo guardar el recordatorio. Revisa los valores que enviaste, por ejemplo que img_url tenga 1.000 caracteres o menos y file_name 100 o menos. |
Cómo se ejecutan los recordatorios#
- La programación se evalúa en la
timezonedel recordatorio, y el mensaje se pone en cola cuando la hora actual coincide con la expresión cron. - Cada ejecución crea un mensaje normal que se envía desde tu número de WhatsApp, así que el número debe seguir conectado.
- Una ejecución se omite si tu espacio de trabajo no tiene créditos, o si no se indicó
whatsapp_clienty no hay ningún número conectado en tu espacio de trabajo en ese momento. - Si se indicó
whatsapp_client, cada ejecución se pone en cola en ese número aunque se haya desconectado desde entonces, y espera allí. No se recurre a otro número. - Los recordatorios se revisan periódicamente, no al segundo, y después el mensaje espera en la cola de envío como cualquier otro. No cuentes con una puntualidad exacta. Si una revisión se retrasa, la ejecución se envía igualmente con hasta 10 minutos de retraso (hasta 1 minuto en la primera ejecución de un recordatorio); pasado ese tiempo, se omite. La misma ejecución nunca se envía dos veces.
Consejos#
- Listar y limpiar: obtén tus recordatorios y sus IDs con Listar recordatorios, y detén uno con Cancelar recordatorio.
- Pausar y editar no está disponible a través de la API. Usa la página de Recordatorios de tu panel.
- Muchos recordatorios a la vez: la página de Recordatorios también permite importar recordatorios desde un archivo CSV.
- Saltos de línea en JSON: escríbelos como
\ndentro demessage. Un salto de línea literal hace que el JSON no sea válido.
