Aller au contenu
WbizTool

API v2 (bêta)

Rappels

Un rappel envoie le même message à un destinataire, encore et encore, selon un planning : le loyer chaque mois, un cours chaque lundi, un rapport chaque soir. Le planning est une expression cron en 5 parties dans le fuseau horaire de votre choix. Les rappels créés avec l'API sont les mêmes que ceux de la page Rappels du tableau de bord.

OpérationEndpointScope
Créer un rappelPOST /api/v2/remindersreminders
Lister les rappelsGET /api/v2/remindersreminders
Obtenir un rappelGET /api/v2/reminders/{id}reminders
Modifier, mettre en pause ou réactiverPATCH /api/v2/reminders/{id}reminders
Supprimer un rappelDELETE /api/v2/reminders/{id}reminders

Créer et modifier des rappels demande un forfait qui inclut les rappels ; sinon, la réponse est 403 plan_required. Lister, lire, mettre en pause et supprimer fonctionnent avec n'importe quel forfait. Pour un message qui part une seule fois à une heure fixée, utilisez plutôt send_at dans Envoyer un message.

Créer un rappel#

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

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

Réponse (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"
}

Corps

namestringobligatoire

Un nom pour le rappel, jusqu'à 100 caractères, tel qu'affiché sur la page Rappels.

toobjectobligatoire

Exactement un des champs phone (format international avec +), group (le nom exact d'un groupe WhatsApp), contact_id ou username (Telegram), comme dans Messages → Destinataires.

frominteger or nullObligatoire pour une clé limitée à certains numéros

L'id du numéro qui l'envoie. Il doit être connecté au moment où vous le définissez. S'il est omis ou vaut null : n'importe quel numéro connecté de l'espace de travail l'envoie.

textstringobligatoire

Le message, jusqu'à 3 000 caractères. C'est aussi la légende lorsque media est envoyé.

mediaobject or nullfacultatif

Une image ou un fichier à envoyer à chaque fois : url ou media_id, et éventuellement type, comme dans Messages → Médias.

scheduleobjectobligatoire

cron (obligatoire) et timezone. Voir Planning.

activebooleanfacultatif

true (par défaut) l'active ; false le crée en pause.

Planning#

schedule.cron comporte cinq parties séparées par des espaces : minute, heure, jour du mois, mois, jour de la semaine. * signifie « chaque ». Ce doit être un planning qui s'exécute à un moment donné (pas le 31 février).

cronS'exécute
0 9 * * 1Le lundi à 09:00
30 18 * * *Tous les jours à 18:30
0 10 1 * *Le 1er de chaque mois à 10:00
0 9 * * 1-5Du lundi au vendredi à 09:00
0 8,20 * * *Tous les jours à 08:00 et 20:00
0 9 15 1 *Le 15 janvier à 09:00, chaque année

schedule.timezone est un nom de fuseau horaire IANA, comme Asia/Kolkata, Europe/London ou America/New_York (UTC par défaut). Les heures du cron sont dans ce fuseau, et next_run_at y est aussi exprimé, avec son décalage. Consultez la référence des fuseaux horaires.

Chaque exécution envoie un message comme n'importe quel autre : il faut des messages restants sur le forfait, et il apparaît dans Lister les messages.

Erreurs à la création#

HTTPCodeQuand
400validation_failedUn champ obligatoire manque ou est vide, un champ est inconnu ou trop long (name, to.group), ou media n'est pas valide
400text_requiredtext est vide
400text_too_longtext dépasse 3 000 caractères
400invalid_cronschedule.cron n'a pas 5 parties, ou ne s'exécute jamais
400invalid_timezoneschedule.timezone n'est pas un fuseau horaire IANA
403plan_requiredLe forfait n'inclut pas les rappels
403number_not_allowedLa clé est limitée à certains numéros et from n'en fait pas partie, ou manque
422invalid_phoneto.phone n'est pas un numéro valide au format international avec +
422invalid_usernameto.username n'est pas un nom d'utilisateur Telegram, un lien ou un identifiant tg:
422username_needs_telegramUn nom d'utilisateur Telegram, mais from n'est pas un compte Telegram (ou, sans from, aucun compte Telegram n'est connecté)
422contact_not_foundAucun contact avec ce to.contact_id
422media_not_foundAucun fichier avec ce media.media_id
422invalid_media_urlmedia.url n'est pas un lien http(s) public
422number_not_connectedfrom n'est pas un numéro connecté de cet espace de travail

Lister les rappels#

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

Les rappels de l'espace de travail, les plus récents d'abord, par pages (limit de 1 à 100, 25 par défaut, et cursor). Les rappels en pause sont inclus, avec "active": false. Une clé limitée à certains numéros ne voit que les rappels qui envoient depuis ceux-ci.

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

La réponse est {"data": [Reminder, …], "next_cursor": "…" or null}.

Obtenir un rappel#

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

Un rappel qui n'existe pas, a été supprimé ou envoie depuis un numéro que la clé ne peut pas utiliser répond 404 reminder_not_found.

Modifier, mettre en pause ou réactiver un rappel#

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

Corps: JSON (application/json)

N'envoyez que les champs qui changent ; les autres gardent leur valeur. Les champs sont ceux de Créer un rappel. La réponse est 200 avec le rappel dans son état actuel.

  • Mettre en pause : {"active": false}. Il cesse de s'exécuter et next_run_at devient null. La mise en pause fonctionne avec n'importe quel forfait.
  • Réactiver : {"active": true}. Il s'exécute de nouveau à partir de sa prochaine heure. La réactivation demande un forfait avec les rappels.
  • schedule est remplacé en entier : envoyez cron avec lui. Sans timezone, le rappel garde son fuseau actuel.
# 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."}'

Une modification répond avec les mêmes erreurs que la création, plus 404 reminder_not_found. Si un champ est incorrect, rien n'est modifié.

Supprimer un rappel#

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

Supprime le rappel : il ne s'exécute plus jamais. Les messages qu'il a déjà envoyés restent dans l'historique. Pour l'arrêter temporairement, mettez-le plutôt en pause.

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

L'objet Rappel#

ChampTypeDescription
idintegerL'identifiant du rappel.
namestringSon nom.
activebooleantrue tant qu'il s'exécute, false lorsqu'il est en pause.
toobjectLe destinataire : phone (avec +), group ou username. Un rappel créé avec contact_id affiche le numéro ou le groupe du contact.
frominteger or nullL'id du numéro d'envoi, ou null pour n'importe quel numéro connecté.
textstringLe message.
mediaobject or nulltype (image ou file), url et file_name.
scheduleobjectcron et timezone.
next_run_atstring or nullSa prochaine exécution, dans son fuseau horaire avec le décalage, comme 2026-10-19T09:00:00+05:30. null lorsqu'il est en pause.
created_atstringQuand il a été créé (UTC).

Voir aussi#