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.
https://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!"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/multi/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": ",".join(["9876543210", "9812345670", "Sales Team Mumbai"]),
"msg": "Our Diwali sale starts tomorrow. Get 20% off on all orders!",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
for item in result["messages"]:
print(item["contact"], "->", item["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/send_msg/multi/", {
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", "9812345670", "Sales Team Mumbai"].join(","),
msg: "Our Diwali sale starts tomorrow. Get 20% off on all orders!",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
for (const item of result.messages) {
console.log(item.contact, "->", item.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' => implode(',', ['9876543210', '9812345670', 'Sales Team Mumbai']),
'msg' => 'Our Diwali sale starts tomorrow. Get 20% off on all orders!',
];
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/multi/');
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) {
foreach ($result['messages'] as $item) {
echo $item['contact'] . ' -> ' . $item['msg_id'] . PHP_EOL;
}
} 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.
Destinataires et message
phonestringobligatoireNumé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_codestringfacultatifIndicatif téléphonique du pays sans
+, par exemple91. Il est ajouté devant chaque numéro de téléphone, sauf si le numéro commence déjà par celui-ci. En JSON, envoyez-le sous forme de chaîne ("91"), et non de nombre. Si vous envoyez un nombre, chaque numéro de téléphone de la liste est traité comme un nom de groupe (is_group: true), et ces messages échouent.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é 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
webhookstringfacultatifURL qui reçoit un
POSTpour chaque message lorsqu'il est envoyé ou échoue. Le contenu est le même que pour Envoyer un message.
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 :
- Uniquement des chiffres (un
+ou des zéros en tête sont acceptés) : traité comme un numéro de téléphone.country_codeest ajouté sauf si le numéro commence déjà par celui-ci ; le numéro doit ensuite comporter de 6 à 15 chiffres. - Tout le reste : traité comme un nom de groupe WhatsApp, trouvé de la même manière que dans Envoyer à un groupe.
- Un groupe dont le nom ne contient que des chiffres (par exemple
2024) est traité comme un numéro de téléphone, et les noms de groupe contenant des virgules ne peuvent pas être utilisés avec cet endpoint. Utilisez Envoyer à un groupe dans ces cas.
Autres points à connaître :
- Les numéros trop courts ou trop longs après l'ajout de l'indicatif pays 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 exemple9123456780aveccountry_code91), 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 n'est pas pris en charge, et
.pdfest ajouté aux fichiers (msg_type2) sans extension prise en charge. Consultez Envoyer des images et des fichiers.
Crédits#
L'ensemble du lot est comparé à vos crédits restants avant toute création. Chaque élément non vide de phone est compté, y compris ceux qui sont ignorés par la suite. Si ce nombre dépasse vos crédits restants, aucun message n'est créé et vous obtenez :
{
"message": "Not enough credits: 120 messages requested, 85 credits remaining",
"status": 0
}
Les messages en file d'attente mais pas encore envoyés sont également déduits de vos crédits restants. Divisez les longues listes en requêtes plus petites ou rechargez votre forfait. 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
}
| Champ | Type | Description |
|---|---|---|
status | integer | 1 si au moins un message a été mis en file d'attente, 0 sinon. |
message | string | Successfully created N messages en cas de succès, sinon l'erreur. |
msg_ids | array of integers | ID des messages en file d'attente, dans l'ordre de phone. Présent uniquement en cas de succès. |
messages | array | Un objet par message en file d'attente. Présent uniquement en cas de succès. |
messages[].msg_id | integer | ID du message. |
messages[].contact | string | Le numéro de téléphone avec l'indicatif pays appliqué, ou le nom du groupe. |
messages[].is_group | boolean | true 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 }
| 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. |
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. |
Not enough credits: … messages requested, … credits remaining | Envoyez moins de destinataires ou ajoutez des crédits. Consultez Crédits. |
Invalid whatsapp client | Cet ID whatsapp_client ne fait pas partie de votre espace de travail. |
No valid contacts found | Tous les éléments de phone étaient vides ou ont été ignorés. Vérifiez que les numéros comportent de 6 à 15 chiffres avec l'indicatif pays. |
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#
- Envoyez
phonesous forme de chaîne : joignez votre liste avec des virgules. Un tableau JSON renvoie{}. - N'utilisez pas pour l'instant
send_bulk_messagesdu client Python : il envoie la liste sous le nomphones, que cet endpoint ignore. Appelez directement l'endpoint comme dans les exemples ci-dessus. - Suivez chaque message : enregistrez chaque
msg_iddemessages, ou transmettez unwebhookpour être notifié de l'envoi ou de l'échec 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.
