API WhatsApp Business

API WhatsApp Business au Maroc : vos messages WhatsApp depuis votre code

L'API WhatsApp Business d'EnvoiSMS.ma envoie vos messages WhatsApp par le même endpoint REST que vos SMS : POST /v1/messages avec channel: "whatsapp", depuis votre propre numéro WhatsApp Business connecté. Templates approuvés par Meta, médias, listes et boutons, réponses dans la fenêtre de 24 heures, accusés de réception par webhook. Chaque message est facturé en dirhams selon sa catégorie : vers un numéro marocain, 0,65 MAD par notification et 0,90 MAD par message marketing, sans abonnement.

Un seul endpoint pour le SMS et WhatsApp

Vous intégrez déjà le SMS ? WhatsApp est le même appel avec un champ de plus : POST https://api.envoisms.ma/v1/messages, en-tête Authorization: Bearer <clé API>, et channel: "whatsapp". Le message part de votre propre numéro WhatsApp Business, connecté dans le tableau de bord. Sans numéro connecté, l'API répond 403 WHATSAPP_NOT_CONNECTED et rien n'est facturé.

  • Même paramètre channel dans les SDK officiels Node.js, PHP, Python et Go
  • Un en-tête Idempotency-Key rend chaque envoi rejouable : un nouvel essai après un timeout ne facture jamais deux fois
  • Erreurs JSON avec un code stable (error.code) sur lequel brancher votre logique

Templates Meta et fenêtre de 24 heures

Un template approuvé par Meta peut ouvrir une conversation à tout moment : il est exempté de la fenêtre de service et facturé selon la catégorie enregistrée sur votre compte. Un message libre (texte, média, liste…) n'est accepté que si le contact vous a écrit sur WhatsApp dans les 24 dernières heures ; sinon l'API répond 400 OUT_OF_24H_WINDOW avant tout débit.

  • template: { name, language, components } pour démarrer une conversation
  • Réponse 400 OUT_OF_24H_WINDOW avec window_expired et window_expires_at
  • Les réactions ne sont pas facturées

Messages riches : médias, listes, boutons

Le même endpoint transporte tous les types de messages WhatsApp : texte, médias par identifiant ou par lien, messages interactifs (liste, boutons, flow, bouton d'URL, demande de localisation), réactions, cartes de contact, localisations et stickers, avec un contexte de réponse pour citer le message du client.

  • interactive : list, button, flow, cta_url, location_request_message
  • Médias par id (déjà téléversé) ou par lien
  • Contexte de réponse sur n'importe quel type de message

Conversations, webhooks et codes OTP

GET /v1/conversations liste vos fils de discussion avec l'heure d'expiration de leur fenêtre de 24 heures, et POST /v1/messages/typing affiche un indicateur de saisie pendant que vous préparez la réponse. Les statuts de vos messages arrivent sur vos webhooks, signés HMAC-SHA256 dans l'en-tête X-EnvoiSMS-Signature-256. Pour un code à usage unique sur WhatsApp, POST /v1/verify/send avec channel whatsapp passe par l'expéditeur partagé d'EnvoiSMS : aucun numéro à connecter.

  • Événements message.sent, message.delivered, message.failed, message.undeliverable
  • Signature t=<horodatage>,v1=<hex> : rejetez toute livraison de plus de 5 minutes
  • Clés sandbox env_test_ : tout le parcours simulé, rien livré ni débité

Tout savoir sur API WhatsApp Business.

Faut-il connecter mon propre numéro WhatsApp pour utiliser l'API ?
Oui pour envoyer des messages avec POST /v1/messages et channel: "whatsapp" : ils partent de votre numéro WhatsApp Business connecté dans le tableau de bord. Sans connexion, l'API répond 403 WHATSAPP_NOT_CONNECTED et ne facture rien. Seuls les codes OTP (POST /v1/verify/send avec channel whatsapp) passent par l'expéditeur partagé d'EnvoiSMS sans connexion.
Que se passe-t-il si j'envoie un message libre hors de la fenêtre de 24 heures ?
L'API le refuse avec 400 OUT_OF_24H_WINDOW avant tout débit. Envoyez à la place un template approuvé par Meta : il ouvre une conversation à tout moment.
Les templates doivent-ils être validés par Meta ?
Oui. Pour démarrer une conversation, vous utilisez un modèle (template) approuvé par Meta. La console permet de soumettre vos modèles et de suivre leur validation.
Peut-on retomber sur le SMS si le destinataire n'a pas WhatsApp ?
Oui : ajoutez cascade: true à un envoi WhatsApp et le message repart en SMS si le numéro est injoignable ou n'a pas WhatsApp. Un type de message que le SMS ne peut pas porter (média, boutons…) est refusé avec CASCADE_NOT_SUPPORTED. Pour un texte ordinaire à un client, le SMS par défaut reste le bon choix.
Comment est facturé un message WhatsApp ?
Au message, en dirhams, selon la catégorie du template et le pays du destinataire, débité de votre solde prépayé sans abonnement. Les prix à jour sont sur la page tarifs.