Installation et premier SMS
npm install envoisms, puis const client = new EnvoiSMSClient(process.env.ENVOISMS_API_KEY!). await client.send({ to: '+212600000000', message: '…', from: 'MonBusiness' }) renvoie l'identifiant du message, que vous suivez avec getMessage() et retrouvez dans vos webhooks.
- import { EnvoiSMSClient } from 'envoisms';
- from : votre Sender ID validé, ou omis pour l'expéditeur par défaut
- sendBulk({ messages: [...], from }) pour un envoi groupé ; listMessages(50, 0) pour les derniers envois
Envois rejouables et erreurs typées
Chaque send() et sendBulk() porte un Idempotency-Key — généré, ou passez idempotencyKey — : un nouvel essai après un timeout ne facture jamais le même message deux fois. Le client rejoue les réponses 5xx et les erreurs réseau ou de timeout jusqu'à maxRetries fois (2 par défaut), avec un délai exponentiel, puis lève EnvoiSMSError avec les propriétés statusCode et code.
- new EnvoiSMSClient({ apiKey, maxRetries: 3, timeoutMs: 20000 })
- err instanceof EnvoiSMSError → err.statusCode, err.code
SMS ou WhatsApp, et la cascade
Le SMS par défaut : il atteint tous les mobiles marocains sans autre configuration que la clé API. channel: 'whatsapp' envoie depuis votre propre numéro WhatsApp Business connecté — 403 WHATSAPP_NOT_CONNECTED sans numéro, 400 OUT_OF_24H_WINDOW pour un texte libre hors de la fenêtre de 24 heures, rien de facturé dans les deux cas. Hors de la fenêtre, passez un template approuvé. cascade: true repasse en SMS si le numéro est injoignable ou n'a pas WhatsApp.
- template: { name: 'order_shipped', language: 'fr', variables: ['89240'] }
- Erreur fréquente : un texte de type SMS avec channel: 'whatsapp' parce que le client utilise WhatsApp — envoyez-le en SMS
OTP, webhooks et compte
client.sendOtp({ to, brand, code_length: 6, expiry: 600 }) renvoie un session_id ; client.checkOtp({ session_id, code }) renvoie verified ; getOtpSession() lit une session sans consommer de tentative. EnvoiSMSClient.verifyWebhookSignature(rawBody, signatureHeader, secret) vérifie l'en-tête X-EnvoiSMS-Signature sur le corps brut, pas sur le JSON décodé.
- sendOtp({ ..., channel: 'whatsapp' }) : code WhatsApp via l'expéditeur partagé, sans connexion
- getBalance(), listPacks(), listPaymentMethods(), createTopup()
- analytics(30), createApiKey(), createOptout()