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.
offline.sha256= 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
| Type | Quand |
|---|---|
offline | Un routeur a cessé de se connecter |
online | Il est de retour |
rebooted | Le temps de fonctionnement est revenu à zéro |
firmware_changed | Nouvelle version du micrologiciel signalée |
wan_ip_changed | L’adresse WAN a changé |
public_ip_changed | L’adresse publique a changé |
first_seen | Un nouveau routeur s’est connecté |
unknown_device | Un identifiant non lié à un appareil s’est connecté |
flapping | Connexion instable (décrochages répétés) |
task_failed | Une commande a été refusée ou a échoué |
test | Vous 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"