Envoyer un message WhatsApp en Node.js avec une API
Envoyer un message WhatsApp depuis du code Node.js ne demande qu'une requête
HTTP — pas de SDK lourd, pas de compte Meta Business. Ce guide montre comment
faire avec fetch natif (Node 18+), de la clé d'API au passage en production.
Ce qu'il vous faut
- Un compte SenWaAPI et une clé d'API (
snw_), depuis votre tableau de bord. - Une session WhatsApp liée (un scan de QR code).
- Node.js 18+ (le
fetchglobal est intégré — aucune dépendance à installer).
Premier envoi en 8 lignes
L'API expose un endpoint REST qui prend un destinataire et un texte :
const resp = await fetch("https://senwaapi.com/api/send-message", {
method: "POST",
headers: {
"Authorization": "Bearer snw_votre_cle_api",
"Content-Type": "application/json",
},
body: JSON.stringify({ to: "+221771234567", text: "Bonjour depuis Node.js 👋" }),
});
console.log(await resp.json());
Le numéro est au format international. En cas de succès, l'API renvoie un JSON confirmant la mise en file du message.
Pas encore sur Node 18 ? Installez
node-fetchouaxios— la logique reste identique : une requête POST avec l'en-têteAuthorizationet un corps JSON.
Gérer les erreurs proprement
En production, ne supposez jamais qu'un envoi réussit. fetch ne lève pas
d'exception sur un code HTTP 4xx/5xx — il faut vérifier resp.ok :
async function envoyerWhatsApp(to, text) {
const resp = await fetch("https://senwaapi.com/api/send-message", {
method: "POST",
headers: {
"Authorization": "Bearer snw_votre_cle_api",
"Content-Type": "application/json",
},
body: JSON.stringify({ to, text }),
});
if (!resp.ok) {
// Journalisez côté serveur, jamais côté client.
const erreur = await resp.json().catch(() => ({}));
throw new Error(`Échec de l'envoi (${resp.status}): ${erreur.code ?? "inconnu"}`);
}
return resp.json();
}
Les deux cas les plus fréquents : clé invalide (401) et session WhatsApp non
liée.
Envoyer un média (image, document…)
Pour un média, utilisez l'endpoint /api/send-media avec une URL publique :
await fetch("https://senwaapi.com/api/send-media", {
method: "POST",
headers: {
"Authorization": "Bearer snw_votre_cle_api",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+221771234567",
url: "https://exemple.com/facture.pdf",
type: "document",
caption: "Votre facture",
}),
});
Le champ type accepte image, video, audio ou document.
File d'attente et rate limit
Chaque session WhatsApp impose un délai minimal entre deux envois
(anti-bannissement). En Node, ne lancez pas vos envois en parallèle avec
Promise.all sur une grosse liste — vous dépasseriez la limite. Sérialisez :
for (const destinataire of liste) {
await envoyerWhatsApp(destinataire, message);
await new Promise((r) => setTimeout(r, 6000)); // respecte l'intervalle
}
Pour de gros volumes, mettez les messages dans une vraie file (BullMQ, etc.) plutôt que de bloquer votre process.
Aller plus loin
Pour recevoir les réponses et les accusés de réception, configurez un webhook (une route Express qui écoute les événements). Et pour le panorama complet — familles d'API, concepts, cas d'usage — voyez le guide complet de l'API WhatsApp. Le même flux existe aussi en Python.
Le détail de chaque endpoint est dans la documentation, et l'essai gratuit de 15 jours (sans carte) vous donne une clé immédiatement.