API de messagerie
API de planification de messages WhatsApp
Planifiez l'envoi d'un texte, d'une image ou d'un document WhatsApp vers un numéro de téléphone ou un groupe à la date et à l'heure de votre choix. Utilisez-la pour les rappels de rendez-vous, les vœux d'anniversaire, les relances et les offres à durée limitée.
https://wbiztool.com/api/v1/schedule_msg/Corps: JSON ou champs de formulaire
Le message attend dans votre file d'attente jusqu'à l'heure prévue, puis il est envoyé depuis votre numéro WhatsApp. La réponse vous fournit un msg_id que vous pouvez utiliser pour vérifier son statut ou l'annuler.
Exemple rapide#
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"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"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",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
print("Scheduled with msg_id", result["msg_id"])
else:
print("Failed:", result.get("message", "no message in response"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
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",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}<?php
$payload = [
'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',
];
$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
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);
curl_close($ch);
if (($result['status'] ?? 0) === 1) {
echo 'Scheduled with msg_id ' . $result['msg_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no message in response');
}Remplacez 12345, YOUR_API_KEY et 678 par vos propres valeurs. Consultez Authentification pour savoir où les trouver.
Paramètres de la requête#
Authentification
client_idintegerobligatoireVotre ID client API, dans Paramètres → Clés API.
api_keystringobligatoireVotre clé API, sur cette même page.
whatsapp_clientintegerobligatoireID du numéro WhatsApp depuis lequel envoyer, dans les paramètres WhatsApp. Contrairement à l'API d'envoi de messages, cet endpoint ne choisit jamais un numéro à votre place.
Planification
datestringobligatoireJour d'envoi du message, au format
dd/mm/yyyy, par exemple24/12/2026.timestringobligatoireHeure d'envoi du message, au format 24 heures
HH:MM, par exemple09:00ou18:45. N'incluez pas les secondes.timezonestringfacultatifFuseau horaire dans lequel sont exprimés
dateettime. Si vous l'omettez, la valeur par défaut estIST(Inde). Consultez Fuseaux horaires.
Destinataire et message
phonestringObligatoire sauf si vous envoyez group_nameLe numéro WhatsApp du destinataire, chiffres uniquement. Les espaces,
+,-,.et les parenthèses sont supprimés automatiquement. Envoyez le numéro soit avec son indicatif pays (919876543210), soit sans celui-ci (9876543210) accompagné decountry_code.group_namestringObligatoire sauf si vous envoyez phoneNom d'un groupe WhatsApp dont votre numéro est membre. Il est trouvé de la même manière que dans Envoyer à un groupe. Envoyez
phoneougroup_name, jamais les deux.country_codestringfacultatifIndicatif téléphonique du pays sans
+, par exemple91pour l'Inde ou1pour les États-Unis. Il est ajouté devantphone, sauf si le numéro commence déjà par celui-ci. Exception : avec91, un numéro à 10 chiffres reçoit toujours le préfixe. Avec les autres indicatifs, envoyez les numéros locaux qui commencent par les mêmes chiffres avec l'indicatif pays déjà inclus. Ignoré pour les groupes.msg_typeintegerfacultatif0texte (par défaut),1image,2fichier ou document.msgstringObligatoire lorsque msg_type vaut 0Texte du message. Pour les images et les fichiers, il s'agit de la légende, qui peut être vide. La mise en forme WhatsApp fonctionne :
*bold*,_italic_,~strikethrough~.messageest accepté comme alias.
Images et fichiers
img_urlstringObligatoire lorsque msg_type vaut 1URL publique
httpouhttpsde l'image.file_urlstringObligatoire lorsque msg_type vaut 2URL publique
httpouhttpsà partir de laquelle le fichier peut être téléchargé directement.file_namestringfacultatifNom du fichier affiché au destinataire, par exemple
invoice-4821.pdf. Il est envoyé en minuscules, les caractères comme& : ? * $ ;sont remplacés par_, et il est tronqué à 150 caractères. Si vous l'omettez, le nom est tiré de l'URL.
Options d'envoi
webhookstringfacultatifURL qui reçoit un
POSTlorsque le message est envoyé ou échoue. Le contenu est le même que pour Envoyer un message.
Quand le message est envoyé#
- Wbiztool convertit
date,timeettimezoneen un instant unique et envoie le message dès que cet instant est passé, à condition que votre numéro WhatsApp soit connecté. - Une heure passée est acceptée. Le message est alors envoyé immédiatement, comme un envoi normal. Vérifiez bien le format de date (
dd/mm/yyyy, jour en premier) pour ne pas envoyer un message plusieurs mois trop tôt. - Si votre numéro est déconnecté à l'heure prévue, le message attend et part dès que le numéro se reconnecte, même si c'est bien plus tard que prévu. Cet endpoint n'a pas d'expiration : annulez le message s'il n'est plus pertinent. Un message qui attend toujours sur un numéro déconnecté ou supprimé 90 jours après son heure prévue est supprimé.
- Tant qu'il n'est pas envoyé, le message a le statut
0(Created) et peut être annulé. Pendant cette attente, il est également déduit de vos crédits restants.
Fuseaux horaires#
timezone accepte soit un nom de fuseau horaire, soit l'une des abréviations ci-dessous.
Noms de fuseaux horaires, comme Asia/Kolkata, America/New_York, Europe/London ou Australia/Sydney. Tout nom de la base de données de fuseaux horaires IANA fonctionne. C'est l'option la plus fiable. Consultez la Référence des fuseaux horaires pour en obtenir la liste.
Les abréviations doivent être écrites en majuscules. Chacune correspond à une région, et l'heure d'été de cette région est appliquée automatiquement :
| Abréviation | Interprétée comme |
|---|---|
IST | Asia/Kolkata |
UTC | UTC |
GMT | GMT |
EST | US/Eastern |
CST | US/Central |
MST | US/Mountain |
PST | US/Pacific |
CET, CEST | Europe/Paris |
EET, EEST | Europe/Athens |
JST | Asia/Tokyo |
AEST, AEDT | Australia/Sydney |
Par exemple, EST en juillet correspond à l'heure d'été de New York (UTC−4), et non à un décalage fixe de UTC−5.
Planifier un message pour un groupe#
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"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"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",
},
timeout=60,
)
print(response.json())// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
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",
}),
});
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'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',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);Réponse#
Une requête réussie renvoie le code HTTP 200 :
{
"msg_id": 9817263,
"message": "Created",
"status": 1
}
| Champ | Type | Description |
|---|---|---|
status | integer | 1 si le message a été planifié, 0 si la requête a échoué. |
message | string | Created en cas de succès, sinon l'erreur. |
msg_id | integer | ID du message planifié. Enregistrez-le pour vérifier son statut ou l'annuler plus tard. Présent uniquement en cas de succès. |
La réponse ne rappelle ni l'heure prévue ni le fuseau horaire : conservez donc une trace de ce que vous avez envoyé.
Erreurs#
La plupart des erreurs renvoient le code HTTP 200 avec status à 0 : vérifiez donc toujours status dans le corps.
{ "message": "Scheduled date & time is not in valid format", "status": 0 }
| Message | Comment corriger |
|---|---|
Auth Error | Envoyez à la fois client_id et api_key. |
Invalid Client Id | Envoyez client_id sous forme de nombre. Renvoyé avec le code HTTP 403. |
Auth Error: invalid api key | Vérifiez que la clé existe, n'a pas été supprimée et appartient à ce client_id. Renvoyé avec le code HTTP 400. |
Either phone or group_name parameter is required | Ajoutez phone ou group_name. |
Please provide either phone OR group_name, not both | Supprimez l'un des deux. |
Invalid phone number | phone ne doit contenir que des chiffres (de 6 à 17), éventuellement précédés de +. |
Invalid Contact Number "…" | Une fois l'indicatif pays ajouté, le numéro doit comporter de 6 à 15 chiffres. |
Msg cant be null | Les messages texte (msg_type 0) nécessitent msg. |
Image Url Can't be null | Pour msg_type 1, envoyez img_url. |
File Url Can't be null | Pour msg_type 2, envoyez file_url. |
Scheduled date & time is not in valid format | date ou time est absent, ou timezone est une chaîne vide. |
Not enough credits | Votre forfait n'a plus de messages disponibles. |
Demo Account can not access apis | Utilisez un compte standard. |
Invalid JSON format: … | Le corps JSON n'est pas valide, ou vous avez envoyé des champs de formulaire sans client_id. |
Conseils#
-
Construisez la date avec soin : en Python, utilisez
strftime("%d/%m/%Y")etstrftime("%H:%M"). En JavaScript, formatez la date et l'heure dans le fuseau horaire que vous envoyez danstimezone, et non dans l'heure locale de votre serveur :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" -
Vérifiez l'heure : planifiez un message de test cinq minutes plus tard et vérifiez qu'il arrive au moment prévu.
-
Changement de programme : pour replanifier, annulez le message et planifiez-en un nouveau.
-
N'utilisez pas les clients officiels pour planifier pour le moment :
schedule_messageen Python envoie la date au formatYYYY-MM-DD(la réponse est{}), etscheduleMessageen Node envoieschedule_time, que cet endpoint ne lit pas. Appelez l'endpoint directement, comme indiqué ci-dessus. -
Messages récurrents : pour les messages qui se répètent, comme les rappels de paiement mensuels, consultez Créer un rappel.
