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énement | Quand |
|---|---|
message.sent | Transmis à l’opérateur |
message.delivered | Remise confirmée |
message.undelivered | L’opérateur n’a pas pu livrer |
message.failed | Rejeté avant l’envoi |
batch.completed | Tous les messages d’un lot ont atteint un statut final |
balance.low | Le solde est passé sous votre seuil |
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.
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));
}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.