Aller au contenu
WbizTool

API de messagerie

API d'envoi à plusieurs numéros

Envoyez le même message WhatsApp à plusieurs numéros de téléphone et groupes en une seule requête. Utilisez-la pour de petites diffusions comme des newsletters, des offres et des annonces.

POSThttps://wbiztool.com/api/v1/send_msg/multi/

Corps: JSON ou champs de formulaire

WbizTool crée un message par destinataire et renvoie un msg_id pour chacun : vous pouvez ainsi vérifier leur statut individuellement.

Exemple rapide#

curl -X POST https://wbiztool.com/api/v1/send_msg/multi/ \
  -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,9812345670,Sales Team Mumbai",
    "msg": "Our Diwali sale starts tomorrow. Get 20% off on all orders!"
  }'

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.

Destinataires et message

phonestringobligatoire

Numéros de téléphone et noms de groupe dans une seule chaîne séparée par des virgules, par exemple 9876543210,9812345670,Sales Team Mumbai. N'envoyez pas de tableau JSON. Consultez Comment les destinataires sont interprétés.

country_codestringfacultatif

Indicatif téléphonique du pays sans +, par exemple 91. Il est ajouté devant chaque numéro de téléphone, sauf si le numéro commence déjà par celui-ci ou est écrit avec + ou 00. En JSON, une chaîne ("91") et un nombre (91) fonctionnent tous les deux.

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é aux destinataires, par exemple price-list.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 pour chaque message lorsqu'il est envoyé, échoue, est annulé ou expire. Le contenu est le même que pour Envoyer un message.

Image depuis une URLcURL
curl -X POST https://wbiztool.com/api/v1/send_msg/multi/ \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": 12345,
    "api_key": "YOUR_API_KEY",
    "whatsapp_client": 678,
    "msg_type": 1,
    "country_code": "91",
    "phone": "9876543210,9812345670",
    "img_url": "https://example.com/offers/diwali-sale.jpg",
    "msg": "Our Diwali sale starts tomorrow."
  }'

Comment les destinataires sont interprétés#

WbizTool découpe phone au niveau des virgules, supprime les espaces autour de chaque élément, puis détermine la nature de chaque élément :

  • Les numéros de téléphone peuvent être écrits tels que vous les avez : +91 98765 43210, 98765-43210, (987) 654-3210, 0091 98765 43210 et +44 (0)20 7946 0018 fonctionnent tous, de même que les valeurs de tableur comme 919876543210.0 et 9.19876543210E+11.
  • country_code est ajouté sauf si le numéro commence déjà par celui-ci ou est écrit avec + ou 00 : +44 20 7946 0018 avec country_code 91 reste 442079460018. Une liste peut donc mélanger plusieurs pays : écrivez les numéros des autres pays avec +.
  • 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.
  • Une fois l'indicatif pays ajouté, un numéro doit comporter de 7 à 15 chiffres.
  • Un texte avec des lettres ou d'autres symboles, comme Sales Team Mumbai ou Family 2024, est traité comme un nom de groupe WhatsApp, trouvé de la même manière que dans Envoyer à un groupe.
  • Un nom de groupe sans lettres, comme 2024-2025, est lu comme un numéro de téléphone, sauf s'il compte moins de 10 chiffres et que votre espace de travail a déjà envoyé un message à un groupe portant exactement ce nom (il figure sous Groupes dans les Contacts). Un nom court de moins de 7 chiffres avec un tiret, un point ou des parenthèses, comme 2024-25 ou (2024), est toujours un nom de groupe. Les noms de groupe contenant des virgules ne peuvent pas être utilisés avec cet endpoint. Utilisez Envoyer à un groupe dans ces cas.
  • Depuis un compte Telegram, un @username, un lien t.me/username ou tg:<id> désigne une personne, pas un nom de groupe, et un numéro de téléphone part vers cette personne sur Telegram. Depuis un numéro WhatsApp, les noms d'utilisateur, les liens t.me et tg:<id> sont ignorés.

Autres points à connaître :

  • Les numéros trop courts ou trop longs après l'ajout de l'indicatif pays, les valeurs de tableur arrondies et les éléments composés uniquement de zéros (0, 00) sont ignorés sans avertissement. Ils n'apparaissent pas dans la réponse et ne reçoivent pas de msg_id.
  • Les doublons ne sont pas supprimés. Un numéro listé deux fois reçoit deux messages.
  • Si un numéro local commence par les mêmes chiffres que country_code (par exemple 9123456780 avec country_code 91), l'indicatif n'est pas ajouté. Envoyez ces numéros avec l'indicatif pays déjà inclus (919123456780).
  • Les URL des images et des fichiers ne sont pas vérifiées lorsque vous appelez l'API. Elles sont téléchargées au moment de l'envoi de chaque message : un lien cassé fait donc échouer les messages plus tard, et non la requête. Les mêmes règles d'envoi que pour l'envoi de messages s'appliquent : les images de plus de 16 Mo et les vidéos de plus de 64 Mo échouent, l'audio WAV et OGG ne peut pas être envoyé comme image (msg_type 1), et .pdf est ajouté aux fichiers (msg_type 2) sans extension ou dont l'extension n'est pas prise en charge. Consultez Envoyer des images et des fichiers.

Limites de messages#

L'ensemble du lot est vérifié avant toute création, de sorte qu'une liste n'est jamais envoyée en partie. Chaque élément non vide de phone est compté, y compris ceux qui sont ignorés par la suite, et les messages en file d'attente mais pas encore envoyés comptent aussi.

  • Tous les forfaits : le lot doit tenir dans la limite quotidienne d'usage raisonnable du numéro d'envoi – 1 000 messages sur n'importe quelle période de 24 heures. Sinon, aucun message n'est créé et vous obtenez :
{
  "message": "Daily limit reached: a number can send 1,000 messages in 24 hours (fair use). Send the rest tomorrow. 1200 messages requested, 640 more can go out from this number in the next 24 hours.",
  "code": "daily_limit_reached",
  "status": 0
}
  • Forfait gratuit : le lot doit aussi tenir dans les messages gratuits restants de l'espace de travail (50 sur n'importe quelle période de 30 jours). Sinon, vous obtenez :
{
  "message": "Not enough credits: 120 messages requested, 35 credits remaining",
  "status": 0
}

Répartissez les longues listes sur plusieurs numéros ou plusieurs jours. Pour les grandes campagnes, téléversez plutôt un tableur depuis la page Campagnes.

Réponse#

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

{
  "msg_ids": [9817263, 9817264, 9817265],
  "messages": [
    { "msg_id": 9817263, "contact": "919876543210", "is_group": false },
    { "msg_id": 9817264, "contact": "919812345670", "is_group": false },
    { "msg_id": 9817265, "contact": "Sales Team Mumbai", "is_group": true }
  ],
  "message": "Successfully created 3 messages",
  "status": 1
}
ChampTypeDescription
statusinteger1 si au moins un message a été mis en file d'attente, 0 sinon.
messagestringSuccessfully created N messages en cas de succès, sinon l'erreur.
msg_idsarray of integersID des messages en file d'attente, dans l'ordre de phone. Présent uniquement en cas de succès.
messagesarrayUn objet par message en file d'attente. Présent uniquement en cas de succès.
messages[].msg_idintegerID du message.
messages[].contactstringLe numéro de téléphone avec l'indicatif pays appliqué, ou le nom du groupe.
messages[].is_groupbooleantrue si l'élément a été traité comme un nom de groupe.

Comparez messages avec la liste que vous avez envoyée pour repérer les numéros ignorés, et vérifiez que is_group vaut false pour chaque élément censé être un numéro de téléphone.

Erreurs#

La plupart des erreurs renvoient le code HTTP 200 avec status à 0 : vérifiez donc toujours status dans le corps. Sauf pour les erreurs HTTP 400 et 403, les réponses (y compris celles qui réussissent) sont du JSON envoyé avec Content-Type: text/html : analysez donc le corps vous-même au lieu de compter sur la détection automatique du JSON (par exemple dans les outils no-code) :

{ "message": "Invalid whatsapp client", "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.
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.
Not enough credits: … messages requested, … credits remainingLes messages du forfait gratuit ne couvrent pas la liste. Envoyez moins de destinataires ou choisissez un forfait. Consultez Limites de messages.
Daily limit reached: … messages requested, … more can go out from this number in the next 24 hours.Répartissez la liste sur plusieurs jours ou numéros. Consultez Limites de messages.
Invalid whatsapp clientCet ID whatsapp_client ne fait pas partie de votre espace de travail.
No valid contacts foundTous les éléments de phone étaient vides ou ont été ignorés. Vérifiez que les numéros comportent de 7 à 15 chiffres avec l'indicatif pays.
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#

  • Envoyez phone sous forme de chaîne : joignez votre liste avec des virgules. Un tableau JSON renvoie {}.
  • N'utilisez pas pour l'instant send_bulk_messages du client Python : il envoie la liste sous le nom phones, que cet endpoint ignore. Appelez directement l'endpoint comme dans les exemples ci-dessus.
  • Suivez chaque message : enregistrez chaque msg_id de messages, ou transmettez un webhook pour être notifié de l'envoi, de l'échec, de l'annulation ou de l'expiration de chacun.
  • Gardez votre numéro connecté : chaque message est envoyé depuis votre numéro WhatsApp, qui doit donc rester connecté dans les paramètres WhatsApp jusqu'à ce que tout le lot soit parti.
  • Texte différent pour chaque personne : cet endpoint envoie le même msg à tout le monde. Appelez Envoyer un message une fois par destinataire pour personnaliser chaque message.