Saltar al contenido
WbizTool

API v2 (beta)

Recordatorios

Un recordatorio envía el mismo mensaje a un destinatario una y otra vez según una programación: el alquiler cada mes, una clase cada lunes, un informe cada tarde. La programación es una expresión cron de 5 partes en la zona horaria que elijas. Los recordatorios creados con la API son los mismos que los de la página Recordatorios del panel.

OperaciónEndpointPermiso
Crear un recordatorioPOST /api/v2/remindersreminders
Listar recordatoriosGET /api/v2/remindersreminders
Obtener un recordatorioGET /api/v2/reminders/{id}reminders
Cambiar, pausar o reanudarPATCH /api/v2/reminders/{id}reminders
Eliminar un recordatorioDELETE /api/v2/reminders/{id}reminders

Crear y cambiar recordatorios requiere un plan que incluya recordatorios; si no, la respuesta es 403 plan_required. Listar, leer, pausar y eliminar funcionan en cualquier plan. Para un mensaje que sale una sola vez a una hora fija, usa en su lugar send_at en Enviar un mensaje.

Crear un recordatorio#

POSThttps://wbiztool.com/api/v2/reminders

Cuerpo: JSON (application/json)

curl -X POST https://wbiztool.com/api/v2/reminders \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: rent-flat-4b" \
  -d '{
    "name": "Weekly rent",
    "from": 101,
    "to": { "phone": "+919876543210" },
    "text": "Hi, a reminder that the rent is due on Friday.",
    "schedule": { "cron": "0 9 * * 1", "timezone": "Asia/Kolkata" }
  }'

Respuesta (201):

{
  "id": 812,
  "name": "Weekly rent",
  "active": true,
  "to": { "phone": "+919876543210" },
  "from": 101,
  "text": "Hi, a reminder that the rent is due on Friday.",
  "media": null,
  "schedule": { "cron": "0 9 * * 1", "timezone": "Asia/Kolkata" },
  "next_run_at": "2026-10-19T09:00:00+05:30",
  "created_at": "2026-10-18T10:20:11.004Z"
}

Cuerpo

namestringobligatorio

Un nombre para el recordatorio, de hasta 100 caracteres, tal como aparece en la página Recordatorios.

toobjectobligatorio

Exactamente uno de phone (formato internacional con +), group (el nombre exacto de un grupo de WhatsApp), contact_id o username (Telegram), como en Mensajes → Destinatarios.

frominteger or nullObligatorio con una clave limitada a algunos números

El id del número que lo envía. Debe estar conectado cuando lo indicas. Si se omite o es null, lo envía cualquier número conectado del espacio de trabajo.

textstringobligatorio

El mensaje, de hasta 3.000 caracteres. También es el pie de foto cuando se envía media.

mediaobject or nullopcional

Una imagen o un archivo para enviar cada vez: url o media_id, y opcionalmente type, como en Mensajes → Medios.

scheduleobjectobligatorio

cron (obligatorio) y timezone. Consulta Programación.

activebooleanopcional

true (predeterminado) lo activa; false lo crea en pausa.

Programación#

schedule.cron tiene cinco partes separadas por espacios: minuto, hora, día del mes, mes y día de la semana. * significa "cada". Debe ser una programación que se ejecute en algún momento (no el 31 de febrero).

cronSe ejecuta
0 9 * * 1Los lunes a las 09:00
30 18 * * *Todos los días a las 18:30
0 10 1 * *El día 1 de cada mes a las 10:00
0 9 * * 1-5De lunes a viernes a las 09:00
0 8,20 * * *Todos los días a las 08:00 y a las 20:00
0 9 15 1 *El 15 de enero a las 09:00, cada año

schedule.timezone es el nombre de una zona horaria IANA, como Asia/Kolkata, Europe/London o America/New_York (predeterminado UTC). Las horas del cron están en esa zona, y next_run_at también se da en ella, con su desfase. Consulta la referencia de zonas horarias.

Cada ejecución envía un mensaje como cualquier otro: necesita que queden mensajes en el plan y aparece en Listar mensajes.

Errores al crear#

HTTPCódigoCuándo
400validation_failedFalta un campo obligatorio o está vacío, un campo es desconocido o demasiado largo (name, to.group), o media no es válido
400text_requiredtext está vacío
400text_too_longtext tiene más de 3.000 caracteres
400invalid_cronschedule.cron no tiene 5 partes o nunca se ejecuta
400invalid_timezoneschedule.timezone no es una zona horaria IANA
403plan_requiredEl plan no incluye recordatorios
403number_not_allowedLa clave está limitada a algunos números y from no es uno de ellos, o falta
422invalid_phoneto.phone no es un número válido en formato internacional con +
422invalid_usernameto.username no es un nombre de usuario de Telegram, un enlace ni un id tg:
422username_needs_telegramUn nombre de usuario de Telegram, pero from no es una cuenta de Telegram (o, sin from, no hay ninguna cuenta de Telegram conectada)
422contact_not_foundNo hay ningún contacto con ese to.contact_id
422media_not_foundNo hay ningún archivo con ese media.media_id
422invalid_media_urlmedia.url no es un enlace público http(s)
422number_not_connectedfrom no es un número conectado de este espacio de trabajo

Listar recordatorios#

GEThttps://wbiztool.com/api/v2/reminders

Los recordatorios del espacio de trabajo, del más reciente al más antiguo, en páginas (limit de 1 a 100, predeterminado 25, y cursor). Se incluyen los que están en pausa, con "active": false. Una clave limitada a algunos números solo ve los recordatorios que se envían desde ellos.

curl "https://wbiztool.com/api/v2/reminders?limit=50" \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"

La respuesta es {"data": [Reminder, …], "next_cursor": "…" or null}.

Obtener un recordatorio#

GEThttps://wbiztool.com/api/v2/reminders/{id}
curl https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"

Un recordatorio que no existe, que se eliminó o que se envía desde un número que la clave no puede usar responde 404 reminder_not_found.

Cambiar, pausar o reanudar un recordatorio#

PATCHhttps://wbiztool.com/api/v2/reminders/{id}

Cuerpo: JSON (application/json)

Envía solo los campos que cambian; los demás conservan sus valores. Los campos son los de Crear un recordatorio. La respuesta es 200 con el recordatorio tal como queda.

  • Pausar: {"active": false}. Deja de ejecutarse y next_run_at pasa a ser null. Pausar funciona en cualquier plan.
  • Reanudar: {"active": true}. Vuelve a ejecutarse a partir de su próxima hora. Reanudar requiere un plan con recordatorios.
  • schedule se reemplaza entero: envía cron con él. Sin timezone, el recordatorio conserva la que tiene.
# Pause
curl -X PATCH https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"active": false}'

# Move it to Fridays at 10:00 and change the text
curl -X PATCH https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"schedule": {"cron": "0 10 * * 5"}, "text": "Hi, the rent is due today."}'

Un cambio responde con los mismos errores que la creación, y con 404 reminder_not_found. Si un campo es incorrecto, no se cambia nada.

Eliminar un recordatorio#

DELETEhttps://wbiztool.com/api/v2/reminders/{id}

Elimina el recordatorio: no vuelve a ejecutarse nunca. Los mensajes que ya envió se quedan en el historial. Para detenerlo solo por un tiempo, ponlo en pausa.

curl -X DELETE https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "id": 812, "deleted": true }

El objeto Reminder#

CampoTipoDescripción
idintegerEl id del recordatorio.
namestringSu nombre.
activebooleantrue mientras se ejecuta, false mientras está en pausa.
toobjectEl destinatario: phone (con +), group o username. Un recordatorio creado con contact_id muestra el número o el grupo del contacto.
frominteger or nullEl id del número que envía, o null para cualquier número conectado.
textstringEl mensaje.
mediaobject or nulltype (image o file), url y file_name.
scheduleobjectcron y timezone.
next_run_atstring or nullCuándo se ejecuta la próxima vez, en su zona horaria con el desfase, como 2026-10-19T09:00:00+05:30. null mientras está en pausa.
created_atstringCuándo se creó (UTC).

Relacionado#