WA API expose un ensemble complet d'endpoints REST pour piloter votre socket WhatsApp, gérer vos tokens, suivre vos quotas et administrer votre service. Rapide, prévisible, sans SDK obligatoire.
WA API est un service HTTP qui reçoit vos requêtes, vérifie votre token, applique vos quotas, puis exécute une commande directement via votre propre socket WhatsApp. Le socket n'est jamais stocké côté serveur : chaque requête est indépendante et auditée.
Ce que vous pouvez faire
Générer et gérer des tokens API avec quota journalier.
Exécuter 23 commandes WhatsApp (individuelles et groupes) via POST /v1/command.
Consulter votre historique et vos statistiques d'utilisation.
Administrer les tokens, la maintenance et les logs via l'espace admin.
i
Format universelToutes les réponses sont au format JSON UTF-8. Toutes les requêtes avec un corps doivent envoyer un Content-Type: application/json.
Configuration
URL de base & versionnement.
Tous les endpoints utilisateur sont préfixés par /v1. Les endpoints administrateurs sont préfixés par /admin. La version 1.0.0 est stable.
Base URL
https://api.web.togehost.online
Démarrage
Trois étapes pour votre première requête.
Générez un token, ouvrez votre socket WhatsApp avec Baileys, puis envoyez votre première commande. Aucun SDK n'est requis : un simple curl ou axios suffit.
Prêt à copier-collerUn client Node.js complet, avec Baileys intégré, est disponible plus bas dans Exemple de client.
Sécurité
Authentification par token.
Deux niveaux d'accès. Le token utilisateur donne accès aux endpoints /v1. Le token administrateur, unique et défini côté serveur, donne accès aux endpoints /admin.
Token utilisateur
Généré à la volée via POST /v1/token/generate. À transmettre dans l'en-tête x-api-token.
x-api-token: 9f31a2b7c4d5...
Token administrateur
Défini via la variable d'environnement ADMIN_TOKEN. Préfixé par ADMIN~. À transmettre dans l'en-tête x-admin-token.
x-admin-token: ADMIN~pEBOFWMh...
!
Ne partagez jamais vos tokensLe token vaut identifiant + mot de passe. Tout appel effectué avec votre token est comptabilisé sur votre quota, imputé à votre journal d'audit et peut déclencher un blocage anti-ban.
Concept
Tokens & cycle de vie.
Chaque token est une chaîne aléatoire de 64 caractères hexadécimaux. Il peut porter un label et un owner_name pour l'identifier dans le tableau de bord.
Création : instantanée, sans validation email.
Validité : illimitée par défaut. Peut être bornée par TOKEN_VALIDITY_DAYS.
Désactivation : un admin peut désactiver ou supprimer un token à tout moment.
Expiration : renvoie 403 avec error: "Token expiré.".
Concept
Quotas journaliers.
Chaque token dispose d'une limite quotidienne (par défaut 50 commandes). Le compteur se réinitialise à minuit UTC. Le quota restant est renvoyé dans chaque réponse de POST /v1/command.
Quota dépasséUne fois la limite atteinte, l'API répond 429 Too Many Requests jusqu'à minuit UTC.
Concept
Système anti-ban.
Pour protéger les comptes WhatsApp, l'API limite à ANTI_BAN_MAX commandes par ANTI_BAN_WIN millisecondes (par défaut : 3 commandes / heure glissante). Au-delà, le token est temporairement bloqué.
Réponse en cas de blocage
{
"error": "Trop de commandes récentes. Réessayez plus tard.",
"code": "ANTI_BAN",
"unblockAt": "2026-07-01T14:32:11.000Z",
"retryAfterMinutes": 42
}
Concept
Mode maintenance.
Lorsqu'un admin active le mode maintenance, toutes les routes hors /admin répondent avec un 503 et un message personnalisable. Utile pour les migrations ou les correctifs urgents.
Concept
Votre socket WhatsApp.
Contrairement à d'autres services, WA API n'héberge pas votre session WhatsApp. Vous ouvrez le socket avec @whiskeysockets/baileys et le passez dans chaque requête via le champ sock. Le socket doit exposer relayMessage ou sendMessage.
i
Pourquoi ce choix ?Aucune session sensible n'est stockée côté serveur. Vous gardez le contrôle total de vos identifiants WhatsApp.
Reference
Endpoints publics.
Ces endpoints ne nécessitent aucun token. Ils exposent les informations générales et permettent la génération d'un token utilisateur.
GET/healthÉtat du service et flag maintenancePUBLIC+
Description
Renvoie l'état du service, sa version et l'état du mode maintenance. Utilisez cet endpoint pour vos sondes de disponibilité (uptime checks).
GET/v1/commandsCatalogue de toutes les commandes disponiblesPUBLIC+
Description
Renvoie la liste exhaustive des commandes exécutables, leur description et leurs paramètres attendus. Idéal pour construire dynamiquement une aide dans votre client.
Client complet, prêt à copier-coller. Ouvre une session Baileys, gère la reconnexion, expose une classe BugWebClient pour parler à l'API, et un embryon de bot avec préfixe .. Installez @whiskeysockets/baileys, axios et pino, renseignez votre token, et lancez.
✓
Installationnpm i @whiskeysockets/baileys axios pino
Node.js · client.js
// ────────────────────────────────────────────────────────────────────────────
// WA API — Client Node.js prêt à l'emploi
// Basé sur Baileys + axios. Renseignez API_URL et API_TOKEN puis lancez.
// ────────────────────────────────────────────────────────────────────────────
const {
default: makeWASocket,
useMultiFileAuthState,
fetchLatestBaileysVersion,
makeCacheableSignalKeyStore,
Browsers,
} = require('@whiskeysockets/baileys');
const pino = require('pino');
const fs = require('fs');
const path = require('path');
const axios = require('axios');
// ─── CONFIGURATION ─────────────────────────────────────────────────────────
const SESSIONS_DIR = path.join(__dirname, 'sessions');
const API_URL = process.env.API_URL || 'https://api.web.togehost.online';
const API_TOKEN = process.env.API_TOKEN || 'VOTRE_TOKEN_ICI';
const PREFIX = process.env.PREFIX || '.';
const OWNER_NUMBER = process.env.OWNER_NUMBER || '33612345678';
if (!fs.existsSync(SESSIONS_DIR)) fs.mkdirSync(SESSIONS_DIR, { recursive: true });
// ─── CLIENT API ────────────────────────────────────────────────────────────
class BugWebClient {
constructor(baseUrl, token = null) {
this.baseUrl = baseUrl;
this.token = token;
this.sock = null;
}
get headers() {
return {
'Content-Type': 'application/json',
...(this.token ? { 'x-api-token': this.token } : {}),
};
}
// GET /health — état du service
async health() {
const { data } = await axios.get(`${this.baseUrl}/health`);
return data;
}
// POST /v1/token/generate — crée un nouveau token
async generateToken(label = 'Bot-Token', owner = 'Utilisateur Bot') {
const { data } = await axios.post(`${this.baseUrl}/v1/token/generate`, {
label, owner_name: owner,
});
return data;
}
// GET /v1/status — quota, anti-ban, métadonnées
async status() {
if (!this.token) throw new Error('Aucun token défini');
const { data } = await axios.get(`${this.baseUrl}/v1/status`, { headers: this.headers });
return data;
}
// GET /v1/history — historique paginé
async history(limit = 50, offset = 0) {
if (!this.token) throw new Error('Aucun token défini');
const { data } = await axios.get(
`${this.baseUrl}/v1/history?limit=${limit}&offset=${offset}`,
{ headers: this.headers }
);
return data;
}
// GET /v1/commands — catalogue
async listCommands() {
const { data } = await axios.get(`${this.baseUrl}/v1/commands`);
return data;
}
// POST /v1/command — exécute une commande via VOTRE socket
async execCommand(type, params = {}) {
if (!this.token) throw new Error('Aucun token défini');
if (!this.sock) throw new Error('Aucun socket WhatsApp connecté');
const payload = { type, sock: this.sock, ...params };
const { data } = await axios.post(`${this.baseUrl}/v1/command`, payload, {
headers: this.headers,
});
return data;
}
setSocket(sock) { this.sock = sock; }
}
// ─── BOT WHATSAPP ──────────────────────────────────────────────────────────
class WhatsAppBot {
constructor() {
this.sock = null;
this.isConnected = false;
this.apiClient = new BugWebClient(API_URL, API_TOKEN);
}
// Démarre la session Baileys
async start() {
const { state, saveCreds } = await useMultiFileAuthState(SESSIONS_DIR);
const { version } = await fetchLatestBaileysVersion();
this.sock = makeWASocket({
version,
logger : pino({ level: 'silent' }),
auth : {
creds : state.creds,
keys : makeCacheableSignalKeyStore(state.keys, pino({ level: 'silent' })),
},
browser: Browsers.ubuntu('Chrome'),
printQRInTerminal: true,
});
// Injecte notre socket dans le client API
this.apiClient.setSocket(this.sock);
// Sauvegarde automatique des credentials
this.sock.ev.on('creds.update', saveCreds);
// Gestion des états de connexion
this.sock.ev.on('connection.update', ({ connection, lastDisconnect }) => {
if (connection === 'open') {
this.isConnected = true;
console.log('✅ WhatsApp connecté');
} else if (connection === 'close') {
this.isConnected = false;
const shouldReconnect =
lastDisconnect?.error?.output?.statusCode !== 401;
console.log('❌ Déconnecté. Reconnexion :', shouldReconnect);
if (shouldReconnect) setTimeout(() => this.start(), 3000);
}
});
// Écoute des messages
this.sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
if (!msg?.message || msg.key.fromMe) return;
await this.handleMessage(msg);
});
}
// Petit routeur de commandes texte préfixées par PREFIX
async handleMessage(msg) {
const body =
msg.message.conversation ||
msg.message.extendedTextMessage?.text || '';
if (!body.startsWith(PREFIX)) return;
const [rawCmd, ...args] = body.slice(PREFIX.length).trim().split(/\s+/);
const cmd = rawCmd.toLowerCase();
const from = msg.key.remoteJid;
try {
if (cmd === 'ping') {
return this.sock.sendMessage(from, { text: '🏓 pong' });
}
if (cmd === 'status') {
const s = await this.apiClient.status();
return this.sock.sendMessage(from, {
text: `📊 Quota: ${s.usage.remaining}/${s.usage.limit}\n` +
`🛡 Anti-ban: ${s.anti_ban.blocked ? 'bloqué' : 'ok'}`,
});
}
// Toute autre commande est transmise à l'API en tant que "type"
const number = (args[0] || '').replace(/[^0-9]/g, '');
if (!number) {
return this.sock.sendMessage(from, { text: '❌ Numéro requis' });
}
const res = await this.apiClient.execCommand(cmd, { number });
await this.sock.sendMessage(from, {
text: `✅ ${cmd} → ${res.target}\n📊 ${res.quota.remaining}/${res.quota.limit}`,
});
} catch (err) {
const apiErr = err.response?.data?.error || err.message;
await this.sock.sendMessage(from, { text: `❌ ${apiErr}` });
}
}
}
// ─── BOOTSTRAP ─────────────────────────────────────────────────────────────
(async () => {
const bot = new WhatsAppBot();
await bot.start();
})();
i
PersonnalisationAdaptez la méthode handleMessage pour ajouter vos propres commandes, une whitelist, un cooldown, ou brancher une base de données.