Rapports de livraisonDisponible

Recevez chaque changement de statut de vos SMS en temps réel.

Sendimo envoie un événement à votre URL chaque fois qu’un message change de statut : plus besoin d’interroger l’API. Configurez l’URL et copiez le secret de signature (whsec_…) dans votre espace.

Événements

ÉvénementQuand
message.sentTransmis à l’opérateur
message.deliveredRemise confirmée
message.undeliveredL’opérateur n’a pas pu livrer
message.failedRejeté avant l’envoi
batch.completedTous les messages d’un lot ont atteint un statut final
balance.lowLe solde est passé sous votre seuil
Requête envoyée à votre serveurHTTP
POST /your/webhook HTTP/1.1
Content-Type: application/json
Sendimo-Signature: t=1761815700,v1=5f8a2b...

{
  "id": "evt_01HF9B2X",
  "type": "message.delivered",
  "created_at": "2026-10-30T09:15:04Z",
  "data": {
    "id": "msg_01HF8Z3K9QX2",
    "status": "delivered",
    "to": "+21620123456",
    "reference": "order-4821",
    "delivered_at": "2026-10-30T09:15:03Z"
  }
}

Vérifier la signature

Chaque requête porte l’en-tête Sendimo-Signature: t=…,v1=…. Calculez le HMAC-SHA256 de {t}.{corps brut} avec votre secret de signature et comparez-le à v1. Rejetez les événements dont t date de plus de 5 minutes.

Vérifier la signature (Node.js)JavaScript
import crypto from "crypto";

export function verifySendimo(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return !!v1 && v1.length === expected.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
Vérifier la signature (Python)Python
import hashlib
import hmac
import time

def verify_sendimo(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t, v1 = parts.get("t"), parts.get("v1")
    if not t or not v1 or abs(time.time() - int(t)) > 300:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, v1)

Règles de livraison

  • Répondez avec un code 2xx en moins de 10 secondes.
  • Sinon, Sendimo réessaie 6 fois sur environ 24 heures : 1 min, 5 min, 30 min, 2 h, 6 h, 15 h.
  • Un événement peut arriver plusieurs fois ou dans le désordre : dédoublonnez sur id et gardez le statut dont created_at est le plus récent.

Les autres intégrations

Prêt à envoyer vos SMS ?

Lancement bientôt en Tunisie. Rejoignez l’accès anticipé.