Aller au contenu
WbizTool

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.

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

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_idintegerobligatoire

Votre ID client API, dans Paramètres → Clés API.

api_keystringobligatoire

Votre clé API, sur cette même page.

whatsapp_clientintegerobligatoire

ID du numéro WhatsApp ou du compte Telegram 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

datestringobligatoire

Jour d'envoi du message, au format dd/mm/yyyy, par exemple 24/12/2026.

timestringobligatoire

Heure d'envoi du message, au format 24 heures HH:MM, par exemple 09:00 ou 18:45. N'incluez pas les secondes.

timezonestringfacultatif

Fuseau horaire dans lequel sont exprimés date et time. Si vous l'omettez, la valeur par défaut est IST (Inde). Consultez Fuseaux horaires.

Destinataire et message

phonestringObligatoire sauf si vous envoyez group_name

Le numéro WhatsApp du destinataire. Les espaces, +, -, ., les parenthèses et un 00 initial sont supprimés automatiquement : +91 98765-43210 fonctionne donc. Les valeurs de tableur comme 919876543210.0 et 9.19876543210E+11 sont lues comme leurs chiffres, mais une valeur arrondie comme 9.19877E+11 est refusée, car il manque des chiffres. Envoyez le numéro soit avec son indicatif pays (919876543210), soit sans celui-ci (9876543210) accompagné de country_code. Un numéro local écrit avec son 0 initial fonctionne aussi : 09876543210 avec country_code 91 part vers 919876543210, et 0612345678 avec 39 (Italie, où le 0 fait partie du numéro) part vers 390612345678. Un numéro écrit avec + ou 00 porte son propre indicatif pays : country_code ne lui est pas ajouté, et un (0) entre parenthèses après l'indicatif est supprimé, donc +44 (0)20 7946 0018 part vers 442079460018. Depuis un compte Telegram, phone peut aussi être un @username, un lien t.me/username ou tg:<id>.

group_namestringObligatoire sauf si vous envoyez phone

Nom 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 phone ou group_name, jamais les deux.

country_codestringfacultatif

Indicatif téléphonique du pays sans +, par exemple 91 pour l'Inde ou 1 pour les États-Unis. Il est ajouté devant phone, sauf si le numéro commence déjà par celui-ci ou est écrit avec + ou 00. Exception : avec 91, 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_typeintegerfacultatif

0 texte (par défaut), 1 image, 2 fichier ou document.

msgstringObligatoire lorsque msg_type vaut 0

Texte 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~. message est accepté comme alias.

Images et fichiers

img_urlstringObligatoire lorsque msg_type vaut 1

URL publique http ou https de l'image.

file_urlstringObligatoire lorsque msg_type vaut 2

URL publique http ou https à partir de laquelle le fichier peut être téléchargé directement.

file_namestringfacultatif

Nom 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

webhookstringfacultatif

URL qui reçoit un POST lorsque le message est envoyé, échoue, est annulé ou expire. Le contenu est le même que pour Envoyer un message.

Quand le message est envoyé#

  • WbizTool convertit date, time et timezone en 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é. Il compte dans la limite quotidienne du numéro le jour où vous le programmez (et dans les messages du forfait gratuit).

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 fonctionnent en majuscules comme en minuscules (IST ou ist). Chacune correspond à une région, et l'heure d'été de cette région est appliquée automatiquement :

AbréviationInterprétée comme
ISTAsia/Kolkata
UTCUTC
GMTGMT
ESTUS/Eastern
CSTUS/Central
MSTUS/Mountain
PSTUS/Pacific
CET, CESTEurope/Paris
EET, EESTEurope/Athens
JSTAsia/Tokyo
AEST, AEDTAustralia/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"
  }'

Réponse#

Une requête réussie renvoie le code HTTP 200 :

{
  "msg_id": 9817263,
  "message": "Created",
  "status": 1
}
ChampTypeDescription
statusinteger1 si le message a été planifié, 0 si la requête a échoué.
messagestringCreated en cas de succès, sinon l'erreur.
msg_idintegerID 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 }
MessageComment corriger
Auth ErrorEnvoyez à la fois client_id et api_key.
Invalid Client IdEnvoyez client_id sous forme de nombre. Renvoyé avec le code HTTP 403.
Auth Error: invalid api keyVé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 requiredAjoutez phone ou group_name.
Please provide either phone OR group_name, not bothSupprimez l'un des deux.
Invalid phone numberphone doit être un numéro de 6 à 17 chiffres. Les lettres et les autres symboles ne sont pas acceptés, pas plus qu'une valeur de tableur arrondie comme 9.19877E+11.
Invalid Contact Number "…"Une fois l'indicatif pays ajouté, le numéro doit comporter de 7 à 15 chiffres.
Msg cant be nullLes messages texte (msg_type 0) nécessitent msg.
Image Url Can't be nullPour msg_type 1, envoyez img_url.
File Url Can't be nullPour msg_type 2, envoyez file_url.
Scheduled date & time is not in valid formatdate ou time est absent, ou timezone est une chaîne vide.
Scheduled date & time is not in valid format: date DD/MM/YYYY and time HH:MM (24-hour)date ou time est dans un autre format (par exemple 2026-12-24 ou 09:00:00) ou ne correspond pas à une date réelle (31/02/2026).
Unknown timezone "…": …timezone n'est ni un nom de fuseau horaire ni l'une des abréviations ci-dessus. Les décalages comme GMT+5:30 ne sont pas acceptés.
Invalid msg_type: use 0 (text), 1 (image) or 2 (file)Envoyez msg_type sous la forme 0, 1 ou 2.
Invalid whatsapp client …whatsapp_client est absent ou ne correspond à aucun de vos numéros. Utilisez l'ID affiché pour un numéro connecté dans votre tableau de bord.
Telegram usernames can only be sent to from a Telegram account: pass its id as whatsapp_clientUn @username, un lien t.me ou tg:<id> dans phone nécessite un compte Telegram comme whatsapp_client.
Server error: the message was not scheduled. Please try again.Un problème est survenu de notre côté. Renvoyé avec le code HTTP 500 ; rien n'a été planifié, réessayez donc.
Not enough creditsL'espace de travail est sur le forfait gratuit et n'a plus de messages : les forfaits payants envoient des messages illimités. Voir Quand il ne reste plus de messages.
Daily limit reached: a number can send 1,000 messages in 24 hours (fair use). Send the rest tomorrow. (HTTP 429, "code": "daily_limit_reached")Ce numéro a pris 1 000 messages au cours des dernières 24 heures (usage raisonnable). La réponse contient quand même le msg_id du message refusé, qui apparaît en échec. Envoyez le reste plus tard ou depuis un autre numéro.
Demo Account can not access apisUtilisez 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") et strftime("%H:%M"). En JavaScript, formatez la date et l'heure dans le fuseau horaire que vous envoyez dans timezone, 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_message en Python envoie la date au format YYYY-MM-DD (refusé car dans un format non valide), et scheduleMessage en Node envoie schedule_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.