Configurer un webhook
Principes de fonctionnement
Chaque fois qu’un message est généré par une balise, il est encapsulé dans une trame JSON standardisée. Cette trame contient toujours le même socle d’informations (horodatage, réseau, batterie, etc.), auquel s’ajoutent les éléments métier (points GPS, événements, configurations…).
Configuration pas à pas
La configuration des webhooks se fait directement depuis l’interface Neyos (onglet Webhooks). Voici la procédure type :
- Connectez-vous à la plateforme Neyos.
- Accédez à l’onglet Webhook
- Cliquez sur .
- Indiquez l’URL cible de votre serveur, et cliquez sur
Activé - Votre webhook est maintenant en marche, les données sont redirigées vers le endpoint enregistré.
Information visibles pour chaque webhook
- Statut d’activation (Enabled / Disabled)
- Type d’événements écoutés
- Statut HTTP renvoyé par votre serveur (200, 400, 500…)
- Temps de réponse moyen du serveur
- Date et type du dernier envoi
Structuration du JSON
Header
L’en-tête regroupe les métadonnées du message : son type (message.created), l’identifiant unique, le type de contenu (datas, logs), ainsi que la date de réception. Ces informations permettent d’identifier et tracer chaque message.
{
"id": "msg_2xcsTDBIyBYJl6OWNfGbAPwHc0w",
"type": "datas",
"network": "gsm",
"mcc": 208,
"mnc": 20,
"rsrq": 100,
"battery": 51,
"temperature": 20,
"receivedAt": "2025-05-26T08:38:21.419+00:00"
}
{
"id": "Identifiant unique du message",
"type": "Type de message : datas, config, event",
"network": "Canal de transmission : gsm ou sat",
"mcc": "Mobile Country Code (code pays opérateur)",
"mnc": "Mobile Network Code (code réseau opérateur)",
"rsrq": "Qualité du signal en pourcentage (0-100%)",
"battery": "Niveau de batterie en pourcentage",
"temperature": "Température en degrés Celsius",
"receivedAt": "Date et heure de réception (ISO 8601)"
}
Elements
Le corps du message porte le contexte réseau (mcc/mnc, opérateur, batterie, température, qualité radio) ainsi que la liste des éléments (elements). C’est ici que se trouvent les données exploitables.
Les éléments représentent la donnée utile issue du terrain. Il peut s’agir :
- d’un Point GPS, avec coordonnées, altitude, vitesse et qualité de fix.
- d’un Événement, tel qu’un appui bouton, une mise en veille, une chute détectée.
- d’une Configuration appliquée à la balise.
- d’un Log, utile pour le diagnostic.
Type "point"
Représente une position GPS et inclut les coordonnées, l'altitude, la vitesse et la validité du fix GPS.
{
"id": "elm_2xcsTFii339xmrqOz71ReQAGi0k",
"type": "point",
"datas": {
"latitude": 13.82172,
"longitude": -7.94417,
"timestamp": 1748248697,
"altitude": 1180,
"speed": 0,
"validity": {
"fixOK": false
}
}
}
{
"id": "Identifiant unique de l'élément",
"type": "Type d'élément : point",
"datas": {
"latitude": "Latitude en degrés décimaux",
"longitude": "Longitude en degrés décimaux",
"timestamp": "Timestamp au format EPOCH",
"altitude": "Altitude en mètres",
"speed": "Vitesse en km/h",
"validity": {
"fixOK": "Position GPS valide (false = position inexacte)"
}
}
}
Type "event"
{
"id": "elm_2xcsTHQGGc5GnUPCuJ2R26NiMmz",
"type": "event",
"datas": {
"latitude": 13.8027,
"longitude": -7.93776,
"timestamp": 1748248700,
"altitude": 1176,
"speed": 0,
"validity": {
"fixOK": false
},
"code": 920,
"eventType": "button_3"
}
}
{
"id": "Identifiant unique de l'élément",
"type": "Type d'élément : event",
"datas": {
"latitude": "Latitude en degrés décimaux",
"longitude": "Longitude en degrés décimaux",
"timestamp": "Timestamp au format EPOCH",
"altitude": "Altitude en mètres",
"speed": "Vitesse en km/h",
"validity": {
"fixOK": "Position GPS valide (false = position inexacte)"
},
"code": "Code numérique de l'événement",
"eventType": "Type d'événement : button_1, button_2, button_3, power_on, power_off, charging_start, charging_stop, sleep, heartbeat"
}
}
Footer
Enfin, le bas de la trame rassemble le contexte opérateur et tracker. Ces champs facilitent le diagnostic ou l’agrégation : vous savez immédiatement quelle balise a généré le message et par quel réseau.
{
"networkOperator": {
"mcc": 208,
"mnc": 20,
"region": "Europe",
"country": "France",
"iso": "FR",
"operator": "Bouygues Telecom",
"brand": "Bouygues"
},
"tracker": {
"id": "tra_2vDzuf37SnBKlM9nq6P9jOz3kx7",
"serial": "03436",
"alias": null,
"createdAt": "2025-04-03T15:37:36.160+00:00",
"updatedAt": "2025-05-26T08:38:21.430+00:00"
}
}
{
"networkOperator": {
"mcc": "Mobile Country Code",
"mnc": "Mobile Network Code",
"region": "Région géographique de l'opérateur",
"country": "Pays de l'opérateur",
"iso": "Code ISO du pays",
"operator": "Nom de l'opérateur mobile",
"brand": "Marque commerciale de l'opérateur"
},
"tracker": {
"id": "Identifiant interne unique de la balise",
"serial": "Numéro de série de la balise",
"alias": "Nom personnalisable défini dans la plateforme",
"createdAt": "Date de création de la balise",
"updatedAt": "Date de dernière mise à jour"
}
}
Exemple de trame JSON
Une fois tous ces éléments mis en forme, voici un exemple de trame complète telle qu’elle est reçue par un webhook.
{
"type": "message.created",
"data": {
"id": "msg_33XXsFGm5F4WGFeX1dQGO8hcvRx",
"type": "datas",
"network": "gsm",
"mcc": 302,
"mnc": 72,
"rsrq": 68,
"battery": 6,
"temperature": 28,
"receivedAt": "2025-10-03T04:09:55.638+00:00",
"elements": [
{
"id": "elm_33XXsH9VdDxY17veBYAjASPr0PC",
"type": "point",
"datas": {
"latitude": 45.471494,
"longitude": -73.418698,
"timestamp": 1759464594,
"altitude": 38,
"speed": 4,
"validity": {
"dateValid": false,
"todValid": false,
"fixOK": true,
"llhValid": true,
"fixType": 3
},
"highAccuracyRaw": "04080003",
"highAccuracy": {
"1": "4",
"2": "8",
"3": "0",
"4": "3"
},
"highAccuracyDecoded": {
"lat": 4,
"lng": 8,
"millis": 3
},
"orginalLatitude": 45.47149,
"latitudeHighAccuracy": 45.471494,
"orginalLongitude": -73.41869,
"longitudeHighAccuracy": -73.418698,
"timestampHighAccuracy": 1759464594.3
},
"messageId": "msg_33XXsFGm5F4WGFeX1dQGO8hcvRx",
"createdAt": "2025-10-03T04:09:55.642+00:00"
}
],
"networkOperator": {
"mcc": 302,
"mnc": 72,
"region": "Amérique du Nord",
"country": "Canada",
"iso": "CA",
"operator": "Rogers",
"brand": "Rogers"
},
"tracker": {
"id": "tra_2zMrxQ8aHDDmw0VfwoR3byi0jfX",
"serial": "06158",
"alias": "4004",
"createdAt": "2025-07-03T14:13:48.842+00:00",
"updatedAt": "2025-10-03T04:09:25.670+00:00",
"network": "gsm",
"battery": 6,
"temperature": 28,
"mcc": 302,
"mnc": 72,
"rsrq": 68,
"connected": true,
"connectedAt": "2025-10-01T13:05:16.224+00:00",
"sleep": true,
"sleepAt": "2025-10-02T12:52:39.347+00:00",
"charging": false,
"chargingAt": null,
"sentAt": "2025-10-03T04:09:25.659+00:00",
"lastPointAt": "2025-10-03T04:09:24.000+00:00",
"latitude": "45.471538",
"longitude": "-73.418938",
"altitude": 46,
"speed": 2,
"configSentAt": "2025-10-03T02:46:07.363+00:00",
"customerId": "cus_2yUvqgD1ewDnpZ6BmDN13Bi75vC"
}
}
}
{
"type": "message.created → Événement de création de message",
"data": {
"id": "msg_33XXs... → Identifiant unique du message",
"type": "datas → Message contenant des données terrain",
"network": "gsm → Transmission via réseau cellulaire",
"mcc": "302 → Canada",
"mnc": "72 → Opérateur Rogers",
"rsrq": "68% → Qualité du signal moyenne",
"battery": "6 → Niveau de batterie 6%",
"temperature": "28°C → Température mesurée par la balise",
"receivedAt": "2025-10-03T04:09:55 → Date et heure de réception",
"elements": [
{
"id": "elm_33XXs... → Identifiant de l'élément",
"type": "point → Point GPS",
"datas": {
"latitude": "45.471494° → Montréal, Québec",
"longitude": "-73.418698° → Montréal, Québec",
"timestamp": "1759464594 → 03/10/2025 04:09:24",
"altitude": "38m → Altitude au-dessus du niveau de la mer",
"speed": "4 km/h → Vitesse de déplacement",
"validity": {
"fixOK": "true → Position GPS fiable",
"fixType": "3 → Fix 3D (0 → Pas de fixe, 2 → Fixe 2D)"
}
},
"messageId": "msg_33XXs... → Référence au message parent",
"createdAt": "2025-10-03T04:09:55 → Date de création"
}
],
"networkOperator": {
"mcc": "302 → Canada",
"mnc": "72 → Code réseau Rogers",
"region": "Amérique du Nord",
"country": "Canada",
"iso": "CA → Code pays ISO",
"operator": "Rogers → Nom de l'opérateur",
"brand": "Rogers → Marque commerciale"
},
"tracker": {
"id": "tra_2zMrx... → ID interne de la balise",
"serial": "06158 → Numéro de série physique",
"alias": "4004 → Nom personnalisé de la balise",
"createdAt": "2025-07-03T14:13:48 → Balise ajoutée en juillet",
"updatedAt": "2025-10-03T04:09:25 → Dernière mise à jour",
"network": "gsm → Réseau cellulaire",
"battery": "6 → Niveau de batterie actuel 6%",
"temperature": "28°C → Température actuelle",
"mcc": "302 → Connectée au Canada",
"mnc": "72 → Via Rogers",
"rsrq": "68% → Signal moyen",
"connected": "true → Balise en ligne",
"connectedAt": "2025-10-01T13:05:16 → Connexion depuis le 1er octobre",
"sleep": "true → En mode veille",
"sleepAt": "2025-10-02T12:52:39 → Mise en veille le 2 octobre",
"charging": "false → Non en charge",
"chargingAt": "null → Pas de charge en cours",
"sentAt": "2025-10-03T04:09:25 → Dernier envoi il y a quelques secondes",
"lastPointAt": "2025-10-03T04:09:24 → Dernier point GPS très récent",
"latitude": "45.471538° → Position actuelle",
"longitude": "-73.418938° → Position actuelle",
"altitude": "46m → Altitude actuelle",
"speed": "2 km/h → Vitesse très faible (quasi stationnaire)",
"configSentAt": "2025-10-03T02:46:07 → Configuration envoyée ce matin",
"customerId": "cus_2yUvq... → Identifiant du client propriétaire"
}
}
}
Suivi et Diagnostic
L’onglet Webhooks de la plateforme vous permet de suivre en temps réel l’état de vos intégrations (statut, codes HTTP, latence, logs). Cela facilite le débogage et garantit la fiabilité des échanges. Dans l’interface Neyos, chaque webhook affiche :
- Succès ou échec des envois (statut HTTP renvoyé).
- Latence de traitement côté serveur client.
- Nombre d’événements envoyés sur une période donnée.
Bonnes pratiques
Pour garantir une intégration robuste, nous recommandons :
- Sécurisez votre URL (HTTPS obligatoire, filtrage IP recommandé).
- Vérifiez la charge : en cas de fort trafic, assurez-vous que votre infrastructure peut absorber les envois.
- Traitez les messages en asynchrone pour éviter de ralentir la réception.
- Archivez les logs pour faciliter le support et le diagnostic.