API des rappels
API de création de rappels
Créez un message WhatsApp récurrent, envoyé automatiquement selon une planification. Utilisez-la pour les rappels de paiement, les points hebdomadaires, les relances quotidiennes et tout autre message qui se répète.
https://wbiztool.com/api/v1/reminder/create/Corps: JSON ou champs de formulaire
Vous décrivez la planification avec une expression cron et un fuseau horaire. Chaque fois que la planification correspond, Wbiztool met en file d'attente un message vers le numéro de téléphone ou le groupe, exactement comme un message envoyé avec Envoyer un message. Les rappels créés ici apparaissent aussi sur la page Rappels de votre tableau de bord, où vous pouvez les mettre en pause ou les modifier.
Exemple rapide#
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'];
}Ce rappel est envoyé à 10:00, heure de l'Inde, le 1er de chaque mois. Remplacez 12345, YOUR_API_KEY et 678 par vos propres valeurs. Consultez Authentification pour savoir où les trouver.
Paramètres de la requête#
Envoyez les paramètres dans un corps JSON ou sous forme de champs de formulaire. En JSON, envoyez chaque valeur textuelle (api_key, reminder_name, phone, message, cron_expression, timezone, img_url, file_name) sous forme de chaîne.
Authentification
client_idintegerobligatoireVotre ID client API, dans Paramètres → Clés API.
api_keystringobligatoireVotre clé API, sur cette même page.
Expéditeur
whatsapp_clientintegerfacultatifID du numéro WhatsApp depuis lequel envoyer, dans les paramètres WhatsApp. Si vous l'omettez, ou si l'ID ne fait pas partie de votre espace de travail, chaque rappel est envoyé depuis le premier numéro connecté de votre espace de travail au moment de son exécution.
Rappel
reminder_namestringobligatoireUn nom pour le rappel, affiché sur la page Rappels et disponible dans le message sous la forme
{reminder_name}.phonestringobligatoireLe numéro WhatsApp du destinataire avec son indicatif pays, par exemple
919876543210. Il n'existe pas de paramètrecountry_codedistinct. Les espaces,+,-,.et les parenthèses sont supprimés, ainsi qu'un0initial (jusqu'à deux zéros initiaux dans un corps JSON). Une valeur qui n'est pas composée uniquement de chiffres est traitée comme un nom de groupe WhatsApp.messagestringobligatoireLe texte du message. Il peut contenir des variables de modèle qui sont remplies à chaque exécution du rappel. La mise en forme WhatsApp fonctionne :
*bold*,_italic_,~strikethrough~.cron_expressionstringobligatoireLe moment de l'envoi, sous forme d'expression cron à cinq champs comme
0 9 * * 1-5. Consultez Expressions cron.timezonestringfacultatifLe fuseau horaire dans lequel s'exécute l'expression cron, sous forme de nom de fuseau horaire IANA comme
Asia/Kolkata,America/New_YorkouEurope/London. Omettez-le pour utiliserUTC. Une chaîne vide renvoieInvalid timezone. Consultez la Référence des fuseaux horaires pour la liste complète.
Images et fichiers
msg_typeintegerfacultatif0texte (par défaut),1image ou2fichier, avecmessagecomme légende. Toute autre valeur est traitée comme0.img_urlstringObligatoire lorsque msg_type vaut 1 ou 2URL publique
httpouhttpsde l'image, ou du fichier pourmsg_type2, jusqu'à 1 000 caractères. Elle est téléchargée à chaque exécution du rappel : veillez donc à ce que le lien reste valide. Vous pouvez héberger des fichiers avec l'API de téléversement de médias.file_namestringObligatoire lorsque msg_type vaut 2Pour
msg_type2, le nom du fichier avec son extension, jusqu'à 100 caractères, par exempleinvoice.pdf. Ignoré pour les autres types de message.
Expressions cron#
Une expression cron est composée de cinq valeurs séparées par des espaces. Le rappel s'exécute chaque fois que l'heure actuelle dans timezone correspond aux cinq valeurs :
┌───────── 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
| Symbole | Signification | Exemple |
|---|---|---|
* | Toutes les valeurs | * dans le champ des heures signifie toutes les heures. |
, | Une liste de valeurs | 9,18 dans le champ des heures signifie 9:00 et 18:00. |
- | Une plage | 1-5 dans le champ du jour de la semaine signifie du lundi au vendredi. |
/ | Un pas | */6 dans le champ des heures signifie toutes les 6 heures. |
Exemples courants#
| Expression | S'exécute |
|---|---|
0 9 * * * | Tous les jours à 9:00 |
0 9 * * 1-5 | Du lundi au vendredi à 9:00 |
0 9 * * 1 | Tous les lundis à 9:00 |
30 18 * * 0 | Tous les dimanches à 18:30 |
0 9,18 * * * | Tous les jours à 9:00 et 18:00 |
0 */6 * * * | Toutes les 6 heures, à l'heure pile |
*/30 9-17 * * 1-5 | Toutes les 30 minutes de 9:00 à 17:30, du lundi au vendredi |
0 9 1 * * | Le 1er de chaque mois à 9:00 |
0 10 15 * * | Le 15 de chaque mois à 10:00 |
0 8 1 1 * | Chaque 1er janvier à 8:00 |
Les heures sont exprimées dans le timezone du rappel. Utilisez uniquement cinq champs : n'ajoutez pas de champ pour les secondes ni de raccourcis comme @daily.
Variables de modèle#
Ces espaces réservés dans message sont remplacés à chaque exécution du rappel. Les dates et heures sont exprimées dans le timezone du rappel.
| Variable | Remplacée par | Exemple |
|---|---|---|
{current_date} | Date | 2026-10-01 |
{current_date_formatted} | Date en toutes lettres, jour complété par un zéro | October 01, 2026 |
{current_time} | Heure au format 24 heures | 09:00:00 |
{current_time_12h} | Heure au format 12 heures | 09:00 AM |
{current_datetime} | Date et heure | 2026-10-01 09:00:00 |
{timezone} | La valeur de timezone | Asia/Kolkata |
{timezone_short} | Abréviation du fuseau horaire | IST |
{reminder_name} | La valeur de reminder_name | Monthly rent reminder |
{to_number} | La valeur de phone enregistrée | 919876543210 |
{client_name} | Nom du propriétaire de l'espace de travail | |
{organisation_name} | Nom de votre espace de travail |
Rappel avec image#
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);L'exemple PHP envoie des champs de formulaire au lieu de JSON. Les deux fonctionnent.
Réponse#
Une requête réussie renvoie le code HTTP 200 :
{
"reminder_id": 3187,
"message": "Reminder created successfully",
"status": 1
}
| Champ | Type | Description |
|---|---|---|
status | integer | 1 si le rappel a été créé, 0 si la requête a échoué. |
message | string | Reminder created successfully, sinon l'erreur. |
reminder_id | integer | ID du nouveau rappel. Enregistrez-le pour pouvoir annuler le rappel plus tard. Présent uniquement en cas de succès. |
Les nouveaux rappels sont actifs immédiatement.
Erreurs#
Les erreurs renvoient le code HTTP 400 avec status à 0, sauf indication contraire :
{ "status": 0, "message": "Invalid timezone" }
| Message | Comment corriger |
|---|---|
Invalid JSON format: … | Le corps JSON n'est pas valide, souvent à cause d'une virgule finale ou d'un saut de ligne non échappé dans message. Utilisez \n pour les retours à la ligne. Vous obtenez aussi ce message pour une requête de formulaire sans client_id, ou pour toute requête GET. |
Invalid client id. | Envoyez client_id sous forme de nombre. |
Reminder name cannot be null | Ajoutez reminder_name. |
Phone number cannot be null | Ajoutez phone. |
Message template cannot be null | Ajoutez message. |
Cron expression cannot be null | Ajoutez cron_expression. |
Auth Error - Please send correct API key and Client id | Envoyez une api_key non vide. |
Invalid cron expression | Vérifiez que l'expression comporte cinq champs valides. Consultez Expressions cron. |
Invalid timezone | Utilisez un nom IANA comme Asia/Kolkata, et non une abréviation comme IST. |
Image URL cannot be null for image messages | Pour msg_type 1, envoyez img_url. |
File URL cannot be null for file messages | Pour msg_type 2, envoyez file_name. |
Auth Error: invalid api key | La clé appartient à un autre client_id. |
Auth Error: please check client id | La clé n'est liée à aucun espace de travail. Créez une nouvelle clé dans l'espace de travail que vous souhaitez utiliser. |
Demo Account cannot access APIs | Utilisez un compte standard. |
Not enough credits | Votre forfait n'a plus de messages disponibles. |
Upgrade your plan to use reminders feature | Votre forfait n'inclut pas les rappels. Passez à un forfait supérieur. |
WhatsApp Logged Out. Please Reconnect!! | Le numéro whatsapp_client est déconnecté. Reconnectez-le dans les paramètres WhatsApp. |
Invalid WhatsApp client id | Envoyez whatsapp_client sous forme de nombre. |
Error creating reminder: … (HTTP 500) | Le rappel n'a pas pu être enregistré. Vérifiez les valeurs envoyées, par exemple que img_url ne dépasse pas 1 000 caractères et file_name pas 100. |
Exécution des rappels#
- La planification est évaluée dans le
timezonedu rappel, et le message est mis en file d'attente lorsque l'heure actuelle correspond à l'expression cron. - Chaque exécution crée un message normal envoyé depuis votre numéro WhatsApp : le numéro doit donc rester connecté.
- Une exécution est ignorée si votre espace de travail n'a plus de crédits, ou si aucun
whatsapp_clientn'a été défini et qu'aucun numéro de votre espace de travail n'est connecté à ce moment-là. - Si
whatsapp_clientest défini, chaque exécution est mise en file d'attente sur ce numéro, même s'il a été déconnecté entre-temps, et y attend. Il n'y a pas de repli sur un autre numéro. - Les rappels sont vérifiés périodiquement, et non à la seconde près, puis le message attend dans la file d'envoi comme n'importe quel autre. Ne comptez pas sur un horaire exact. Si une vérification a du retard, l'exécution est tout de même envoyée jusqu'à 10 minutes en retard (jusqu'à 1 minute pour la première exécution d'un rappel) ; au-delà, elle est ignorée. Une même exécution n'est jamais envoyée deux fois.
Conseils#
- Lister et faire le ménage : obtenez vos rappels et leurs ID avec Lister les rappels, et arrêtez-en un avec Annuler un rappel.
- La mise en pause et la modification ne sont pas disponibles via l'API. Utilisez la page Rappels de votre tableau de bord.
- Nombreux rappels à la fois : la page Rappels permet aussi d'importer des rappels depuis un fichier CSV.
- Retours à la ligne en JSON : écrivez-les sous la forme
\ndansmessage. Un saut de ligne brut rend le JSON invalide.
