Webhooks offerts, API REST en développement

API et webhooks

Les webhooks et l’API sont offerts uniquement avec le forfait Pro.

URMS transmet dès aujourd’hui chaque événement de routeur à vos systèmes sous forme de webhook signé. Une API REST pour les systèmes de facturation et les CRM est en développement.

Ce qui est offert

Webhooks Offert

Configurez un canal webhook dans votre espace, sous Notifications. Choisissez les types d’événements, la gravité minimale, les clients et les heures de silence. Chaque envoi est signé et consigné.

Telegram Offert

Les mêmes événements sous forme de messages lisibles, au moyen de votre propre robot et de votre propre conversation Telegram.

API REST En développement

Prévu : lister les routeurs et leur état, lancer l’actualisation et le redémarrage, modifier le Wi-Fi, et suspendre ou rétablir le service d’un abonné depuis votre système de facturation. Les points de terminaison seront documentés ici lorsqu’ils seront en service.

Concevez-la avec nous

Si vous exploitez un système de facturation ou un CRM et souhaitez l’intégrer tôt, dites-nous d’abord ce dont vous avez besoin.

Format des webhooks

URMS envoie à votre URL une requête HTTP POST avec un corps JSON. L’URL doit être une adresse http ou https publique. Les redirections ne sont pas suivies.

X-URMS-EventType d’événement, par exemple offline.
X-URMS-DeliveryIdentifiant de l’événement. Utilisez-le pour ignorer les doublons.
X-URMS-TimestampHeure Unix de l’envoi.
X-URMS-Signaturesha256= suivi du HMAC-SHA256 de timestamp + "." + body, calculé avec le secret de votre canal comme clé.
# POST https://example.com/hooks/urms
{
  "id": 1042,
  "type": "offline",
  "severity": "crit",
  "occurred_at": "2026-10-17T18:40:00Z",
  "sandbox": "acme",
  "title": "Offline: Main office router",
  "detail": "No check-in for 10 min (last contact 18:30 UTC).",
  "url": "https://app.urms.cloud/t/acme/devices/12",
  "device": {
    "id": 12,
    "label": "Main office router",
    "login": "acme0001",
    "serial": "SN0000000001",
    "client": "Example Client"
  }
}

Vérifier la signature

Recalculez le HMAC sur le corps brut et comparez en temps constant. Rejetez les horodatages trop anciens pour bloquer les attaques par rejeu.

Types d’événements

TypeQuand
offlineUn routeur a cessé de se connecter
onlineIl est de retour
rebootedLe temps de fonctionnement est revenu à zéro
firmware_changedNouvelle version du micrologiciel signalée
wan_ip_changedL’adresse WAN a changé
public_ip_changedL’adresse publique a changé
first_seenUn nouveau routeur s’est connecté
unknown_deviceUn identifiant non lié à un appareil s’est connecté
flappingConnexion instable (décrochages répétés)
task_failedUne commande a été refusée ou a échoué
testVous avez cliqué sur « Send test »
# Python 3, bibliothèque standard seulement
import hmac, hashlib, time

def verify(secret: str, headers, body: bytes) -> bool:
    ts = headers["X-URMS-Timestamp"]
    if abs(time.time() - int(ts)) > 300:
        return False  # trop ancien, rejeu possible
    mac = hmac.new(secret.encode(),
                   ts.encode() + b"." + body,
                   hashlib.sha256).hexdigest()
    return hmac.compare_digest(
        "sha256=" + mac,
        headers["X-URMS-Signature"])

# Example only: use your own channel secret
secret = "whsec_example_0000000000000000"