Envoyez des messages WhatsApp avec Node.js
Envoyez des textes, images et fichiers WhatsApp depuis votre application Node.js, à partir de votre propre numéro relié à WbizTool comme WhatsApp Web. Utilisez le package officiel wbiztool-client ou le fetch intégré à Node.js 18 et versions ultérieures.
Essai gratuit : 50 messages sur n’importe quelle période de 30 jours, sans carte bancaire.
Comment ça marche
Obtenez votre clé API et reliez votre numéro
Inscrivez-vous, puis reliez votre numéro WhatsApp sur la page Numéros WhatsApp avec un code QR ou un code de connexion, comme WhatsApp Web. Dans Paramètres → Clés API, créez une clé et copiez votre Client ID (le guide des clés API ci-dessous montre où). L’ID affiché sur la carte du numéro (par exemple ID 678) est votre
whatsapp_client.Installez le client, ou utilisez fetch
Lancez
npm install wbiztool-clientpour le client officiel. Ou appelez l’API avec fetch, qui ne demande aucun package à partir de Node.js 18.Envoyez le message
Faites un POST de vos identifiants, du numéro de téléphone et du texte vers
https://wbiztool.com/api/v1/send_msg/. Une réponse avec"status": 1et unmsg_idsignifie que le message est en file d’attente sur votre numéro.Vérifiez qu’il est parti
Passez une URL
webhookpour être prévenu quand le message est envoyé ou échoue, ou interrogez l’endpoint de statut du message avec lemsg_id.
Exemples de code Node.js
npm install wbiztool-clientconst { WbizToolClient } = require("wbiztool-client");
const client = new WbizToolClient({
clientId: 12345,
apiKey: "YOUR_API_KEY",
whatsappClient: 678,
});
(async () => {
// Errors throw, with the API's response in the error message.
const result = await client.sendMessage({
phone: "9876543210",
countryCode: "91",
message: "Hi Aman, your order #4821 has shipped.",
});
console.log(result);
})().catch(console.error);// 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/", {
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, your order #4821 has shipped and will arrive on Thursday.",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Queued with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message);
}{"status": 1, "message": "Created", "msg_id": 9817263}// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";
const form = new FormData();
form.append("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("whatsapp_client", "678");
form.append("msg_type", "2");
form.append("country_code", "91");
form.append("phone", "9876543210");
form.append("msg", "Your invoice for order #4821 is attached.");
form.append("file_name", "invoice-4821.pdf");
form.append("file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");
// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", { method: "POST", body: form });
console.log(await response.json());// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const msgId = 9817263;
const response = await fetch(`https://wbiztool.com/api/v1/message/status/${msgId}/`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.message === "Unknown message id") {
console.log("No message with this ID in your workspace");
} else if (!("status_text" in result)) {
console.error("Request failed:", result.message ?? "no message in response");
} else if (result.status === 1) {
console.log("Sent");
} else if (result.status === 2) {
console.log("Failed:", result.error);
} else {
console.log("Status:", result.status_text);
}// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const tz = "Asia/Kolkata";
const sendAt = new Date(Date.now() + 2 * 60 * 60 * 1000); // two hours from now
// Format the date and time in the timezone you send, not your server's.
const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(sendAt); // "24/12/2026"
const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(sendAt); // "09:00"
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 starts in 30 minutes.",
date,
time,
timezone: tz,
}),
});
const result = await response.json(); // schedule errors come back with HTTP 200 and "status": 0
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}const express = require("express");
const app = express();
// WbizTool posts form fields, not JSON.
app.post("/wbiztool-webhook", express.urlencoded({ extended: false }), (req, res) => {
const { msg_id, status } = req.body; // status: SENT, FAILED, CANCELLED or EXPIRED
console.log(msg_id, status);
res.sendStatus(200);
});
app.listen(3000);Ce que vous pouvez faire
Textes, images et fichiers
Réglez
msg_typesur 0 pour du texte, 1 pour une image ou 2 pour un fichier. Indiquez uneimg_urlou unefile_urlpublique, ou téléversez le fichier en multipart form data dans un champ nomméfile.Messages personnalisés à partir de vos données
Remplissez
msgà partir de vos propres données – un nom, un numéro de commande, une échéance. La mise en forme WhatsApp comme *gras* et _italique_ fonctionne, jusqu’à 3 000 caractères.Des webhooks pour chaque statut
Passez
webhooket votre serveur reçoit un POST encodé comme un formulaire, par exemplemsg_id=9817263&status=SENT, quand le message est envoyé, échoue, est annulé ou expire.Planifier pour plus tard
Faites un POST vers
/api/v1/schedule_msg/avecdate(jj/mm/aaaa),time(HH:MM) et untimezone. Formatez la date avecIntl.DateTimeFormatdans ce même fuseau horaire, pas dans celui de votre serveur.Abandonner les messages trop tardifs
expire_after_secondsmarque un message comme expiré s’il n’est pas parti à temps, ce qui convient aux messages urgents comme une heure de livraison prévue.Rappels récurrents
L’API de rappels répète un message selon un planning cron, par exemple à 10 h le 1er de chaque mois. Les rappels nécessitent un forfait payant.
Bon à savoir
"status": 1signifie que le message est en file d’attente, pas qu’il est remis. Sent est l’état final de réussite ; l’API n’indique pas si le message a été remis ou lu.- Les erreurs d’envoi de message reviennent avec HTTP 400 (429 à la limite quotidienne) ; les erreurs de planification reviennent en général avec HTTP 200 et
"status": 0: analysez donc toujours le corps et vérifiezstatusplutôt queresponse.ok. - Le
scheduleMessagedu client officiel envoie un champ que l’endpoint de planification ne lit pas. Appelez plutôt/api/v1/schedule_msg/avec fetch, comme ci-dessus. - Gardez la clé API sur votre serveur, par exemple dans une variable d’environnement. Quiconque la possède peut envoyer depuis vos numéros : ne la mettez jamais dans du JavaScript côté navigateur, dans une application mobile ou dans du code que vous publiez.
- Pour publier dans un groupe WhatsApp plutôt que vers un numéro, voir l’exemple des messages de groupe : il fonctionne avec tous les forfaits, essai gratuit compris.
- L’essai gratuit inclut 50 messages sur n’importe quelle période de 30 jours et 1 numéro, sans carte bancaire. Les forfaits payants commencent à 25 $ par mois aux États-Unis (votre prix figure sur la page Tarifs) et envoient des messages illimités dans le cadre d’un usage raisonnable : jusqu’à 1 000 par jour et par numéro.
- Les messages partent de votre propre numéro WhatsApp, donc les règles de WhatsApp s’appliquent : écrivez aux personnes qui s’attendent à avoir de vos nouvelles.
Questions fréquentes
- Existe-t-il un package Node.js officiel pour l’API WbizTool ?
- Oui :
wbiztool-clientsur npm (npm install wbiztool-client). SonsendMessageenvoie un message. Pour planifier et vérifier le statut, appelez les endpoints avec fetch comme ci-dessus. - Puis-je appeler l’API depuis le navigateur ?
- Non, ne le faites pas : la requête contient votre clé API, et quiconque la possède peut envoyer depuis vos numéros. Appelez l’API depuis votre serveur Node.js et gardez la clé dans une variable d’environnement.
- Comment savoir si le message a été envoyé ?
- Une réponse avec
"status": 1et unmsg_idsignifie qu’il est en file d’attente. Passez une URLwebhookpour recevoir un POST avecSENT,FAILED,CANCELLEDouEXPIRED, ou appelez l’endpoint de statut du message avec lemsg_id. Sent est l’état final : l’API n’indique pas si le message a été remis ou lu. - Quel format de numéro de téléphone envoyer ?
- Envoyez le numéro avec son indicatif pays (919876543210), ou sans (9876543210) avec
country_code(91). Les espaces, le +, les tirets et les parenthèses sont retirés pour vous : +91 98765-43210 fonctionne aussi. - Ai-je besoin de l’API WhatsApp Business ou d’une validation Meta ?
- Non. WbizTool envoie depuis votre propre numéro WhatsApp ou WhatsApp Business, relié comme WhatsApp Web. Pas de validation Meta, et aucun modèle de message à faire approuver.
- Est-ce payant au message ?
- Non. L’essai gratuit inclut 50 messages sur n’importe quelle période de 30 jours. Les forfaits payants envoient des messages illimités dans le cadre d’un usage raisonnable, jusqu’à 1 000 par jour et par numéro : Lite 25 $, Standard 59 $ et Advanced 149 $ par mois aux États-Unis ; la page Tarifs affiche le prix de votre pays.
Lire les guides
- API d’envoi de message
- API de statut du message
- API de planification de message
- Clés API et Client ID
- Connecter votre numéro WhatsApp
Voir aussi
- PythonEnvoyez des messages WhatsApp depuis Python avec le client officiel ou simplement requests.
- cURLEnvoyez, planifiez et suivez des messages WhatsApp avec une seule commande cURL.
- n8nEnvoyez des messages WhatsApp depuis n8n avec le node communautaire WbizTool.
- Suivi de commandeConfirmations de commande, avis d’expédition et alertes de nouvelles commandes pour Shopify, WooCommerce et d’autres.
Envoyez votre premier message WhatsApp automatisé dès aujourd'hui
Créez un compte, scannez le QR code et envoyez un message en moins de cinq minutes.
Essai gratuitForfaits payants à partir de 25 $ par mois aux États-Unis. Tarifs
