Installation et premier SMS
pip install envoisms, puis client = EnvoiSMSClient(api_key=os.getenv("ENVOISMS_API_KEY")). client.send(to="+212600000000", message="…", from_sender="MonBusiness") renvoie l'identifiant du message, que vous suivez avec get_message() et retrouvez dans vos webhooks.
- from envoisms import EnvoiSMSClient
- from_sender : votre Sender ID validé, ou omis pour l'expéditeur par défaut
- send_bulk(messages=[...], from_sender=...) pour un envoi groupé ; list_messages(limit=50, offset=0) pour les derniers envois
Envois rejouables et erreurs
Chaque send() et send_bulk() porte un Idempotency-Key — généré, ou passez idempotency_key= — : 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 jusqu'à max_retries fois (2 par défaut), avec un délai exponentiel, puis lève EnvoiSMSError avec les attributs status_code et code.
- EnvoiSMSClient(api_key=..., max_retries=3, timeout=20)
- except EnvoiSMSError as e: e.status_code, e.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"]}
- Laissez channel sur "sms" pour tout texte ordinaire à un client
OTP, webhooks et compte
client.send_otp(to=..., brand="MonBusiness", code_length=6, expiry=600) renvoie un session_id ; client.check_otp(session_id=..., code=...) renvoie verified ; get_otp_session() lit une session sans consommer de tentative. EnvoiSMSClient.verify_webhook_signature(raw_body=..., signature_header=..., secret=...) vérifie l'en-tête X-EnvoiSMS-Signature sur le corps brut de la requête.
- send_otp(..., channel="whatsapp") : code WhatsApp via l'expéditeur partagé, sans connexion
- get_balance(), list_packs(), create_topup(amount_mad=200, payment_method="stripe")
- analytics(days=30), create_api_key(), create_optout()