Documentation API

Endpoint unifié pour envoyer SMS, Email et WhatsApp depuis vos systèmes.

Mes clés API

Passerelle transactionnelle

Documentation API

Authentifiez-vous avec X-API-Key, puis envoyez via POST /api/v1/messaging/send/.

Passerelle transactionnelle

Un point d’entrée unique pour envoyer des messages transactionnels (SMS, Email, WhatsApp) depuis un CRM, un e-commerce ou toute application tierce.

Toutes les requêtes passent en HTTPS, corps en JSON.

Authentification

Transmettez votre clé API active dans l’en-tête HTTP X-API-Key à chaque requête. Créez une clé dans Développeurs → Clés API.

X-API-Key: votre_cle_api_secrete_ici

Attention : ne placez jamais une clé API dans du code navigateur ou une app mobile publique — risque de consommation frauduleuse de vos stocks.

Envoi de messages unifié

POST /api/v1/messaging/send/

Paramètres (JSON body)

Champ Type Requis Description
channel String Oui Canal d’envoi : SMS, EMAIL ou WHATSAPP.
to String Oui Destinataire.
SMS / WhatsApp : numéro E.164 (ex. +243812345678).
Email : adresse valide (ex. client@domaine.com).
content String Oui Contenu du message (texte ou HTML pour l’email).
subject String Conditionnel Requis si channel = EMAIL. Sujet de l’e-mail.
cc Array Non Email uniquement. Liste d’adresses en copie.
smtp_config_id String Non Email uniquement. Identifiant public (public_id) d’une config SMTP active de votre compte. Sinon, SMTP Jiwe par défaut.

SMS : un nom d’expéditeur doit être configuré sur le profil du compte avant tout envoi SMS (console ou API).

Exemple — EMAIL

{
  "channel": "EMAIL",
  "to": "client@exemple.com",
  "subject": "Confirmation de commande",
  "content": "<p>Bonjour, votre commande a bien été reçue.</p>",
  "cc": ["factures@monentreprise.com"]
}

Exemple — SMS

{
  "channel": "SMS",
  "to": "+243812345678",
  "content": "Votre code de validation est 883921."
}

Stocks prépayés et demandes d’achat

Ces endpoints utilisent le jeton JWT de la console (Authorization: Bearer …), et non une clé d’envoi.

GET/api/v1/billing/inventories/

Retourne les stocks disponible et réservé de chaque canal, avec le prix unitaire actif.

POST/api/v1/billing/purchases/
{
  "channel": "sms",
  "quantity": 500
}

Le prix est figé lors de la demande. L’admin crédite le stock uniquement après validation du paiement.

GET/api/v1/billing/purchases/
GET/api/v1/billing/unit-transactions/

Réponses & codes de statut

202 Accepted

Message accepté et mis en file d’attente.

{
  "message_id": "msg_01KSMFHDKK16D1TZFCT7Z3JCSZ",
  "status": "PENDING"
}
400 Bad Request

Validation ou contrainte métier (stock, plafond, format).

{
  "error": "InsufficientChannelUnits",
  "message": "Stock SMS insuffisant : 1 unité disponible, 2 requises.",
  "code": "insufficient_channel_units",
  "channel": "sms",
  "available_units": 1,
  "required_units": 2
}

Exemples d’intégration

curl -X POST https://api.jiwe.cd/api/v1/messaging/send/ \
  -H "Content-Type: application/json" \
  -H "X-API-Key: votre_cle_api" \
  -d '{
    "channel": "SMS",
    "to": "+243812345678",
    "content": "Test de message transactionnel"
  }'
import requests

url = "https://api.jiwe.cd/api/v1/messaging/send/"
headers = {
    "Content-Type": "application/json",
    "X-API-Key": "votre_cle_api"
}
payload = {
    "channel": "EMAIL",
    "to": "client@exemple.com",
    "subject": "Sujet de test",
    "content": "Bonjour depuis l'API Python",
    "cc": ["copie@exemple.com"]
}

response = requests.post(url, json=payload, headers=headers)
print(response.status_code, response.json())
const url = 'https://api.jiwe.cd/api/v1/messaging/send/';

const response = await fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'votre_cle_api'
  },
  body: JSON.stringify({
    channel: 'WHATSAPP',
    to: '+243812345678',
    content: 'Votre colis est en route !'
  })
});

console.log(await response.json());