Référence de l'API EasyTrack
L'ensemble des endpoints que vous pouvez intégrer sur votre propre système ou application externe : authentification, trackers, positions GPS temps réel, véhicules, geofences, affectations d'agents, alertes, rapports et liens de partage.
Vue d'ensemble
L'API EasyTrack est une API REST JSON hébergée sur Cloudflare (edge, région UE).
Toutes les requêtes se font en HTTPS. Les réponses sont au format
application/json (sauf export CSV/PDF). Les données de suivi temps réel proviennent
des trackers Teltonika / FMC et sont accessibles quelques secondes après leur réception serveur.
| Domaine | https://api.easytrack.ch |
|---|---|
| Format | JSON UTF-8 |
| Auth | Jeton Bearer (obtenu par code OTP email) |
| Méthodes | GET, POST, PUT, PATCH, DELETE |
| CORS | Activé (Access-Control-Allow-Origin: * sur les ressources principales) |
URL de base & formats
https://api.easytrack.ch
Chaque endpoint ci-dessous est relatif à cette base. Exemple :
GET /devices → https://api.easytrack.ch/devices.
Authentification
La quasi-totalité des endpoints nécessitent un jeton Bearer. Le jeton s'obtient en deux
étapes : demande d'un code OTP par email, puis vérification du code. Ajoutez ensuite le header
Authorization à chaque requête :
Authorization: Bearer <votre_token>
Content-Type: application/json
401 avec {"error":"Token manquant"} ou
{"error":"Session invalide ou expirée"}. Les endpoints marqués
Public ne requièrent pas de jeton.
Premier appel
1 · Demander un code
curl -X POST https://api.easytrack.ch/auth/request-code \
-H "Content-Type: application/json" \
-d '{"email":"vous@exemple.ch","lang":"fr"}'
2 · Vérifier le code et récupérer le jeton
curl -X POST https://api.easytrack.ch/auth/verify-code \
-H "Content-Type: application/json" \
-d '{"email":"vous@exemple.ch","code":"123456"}'
# => { "success": true, "token": "…", "expires_at": "…", "user": { … } }
3 · Lister vos trackers
curl https://api.easytrack.ch/devices \
-H "Authorization: Bearer <token>"
En JavaScript (fetch) :
const res = await fetch("https://api.easytrack.ch/devices", {
headers: { Authorization: `Bearer ${token}` }
});
const { devices } = await res.json();
Familles d'endpoints
Authentification — connexion & session
Envoie un code OTP à 6 chiffres par email (ou SMS).
Body
{
"email": "vous@exemple.ch",
"lang": "fr" // optionnel (fr, de, en, it…)
}
Réponse
{ "success": true, "message": "Code envoyé", "expires_in": 600 }
Vérifie l'OTP et retourne un jeton Bearer. Si la 2FA est activée, renvoie requires_2fa.
Body
{ "email": "vous@exemple.ch", "code": "123456" }
Réponse (sans 2FA)
{
"success": true,
"token": "…",
"expires_at": "2026-08-01T10:00:00.000Z",
"user": { "id": 42, "email": "vous@exemple.ch", "role": "client", "two_factor_enabled": false }
}
Réponse (2FA requise)
{ "success": true, "requires_2fa": true, "pending_token": "…" }
Finalise la connexion avec le code TOTP (ou un code de secours) et le pending_token.
Body
{ "pending_token": "…", "code": "654321" }
Envoie un lien de connexion à usage unique par email.
Body
{ "email": "vous@exemple.ch" }
Retourne l'utilisateur associé au jeton courant (utile pour valider une session).
Invalide la session courante (le jeton n'est plus utilisable).
Liste les sessions actives du compte. DELETE /auth/sessions révoque les autres sessions.
Authentification — 2FA & profil
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /auth/profile | Récupérer le profil |
| PUT | /auth/profile | Mettre à jour le profil (nom, langue…) |
| GET | /auth/2fa/status | État de la 2FA |
| POST | /auth/2fa/setup | Générer le secret TOTP + QR |
| POST | /auth/2fa/verify | Activer la 2FA (valide un code) |
| POST | /auth/2fa/disable | Désactiver la 2FA |
| POST | /auth/2fa/backup-codes | Régénérer les codes de secours |
| POST | /auth/push-token | Enregistrer un token push (mobile) |
| DELETE | /auth/push-token | Supprimer un token push |
| GET | /auth/notification-preferences | Préférences de notification |
| PUT | /auth/notification-preferences | Modifier les préférences |
Trackers (devices)
Un device est un tracker GPS identifié par son imei. Les endpoints ci-dessous ne
retournent que les trackers de votre compte (et ceux partagés avec vous).
Liste enrichie de vos trackers : dernière position, batterie, statut en ligne, véhicule associé, agent actif, backup SIM.
Réponse (extrait)
{
"success": true,
"source": "known_devices",
"devices": [
{
"id": 12, "imei": "350612073912345", "name": "Camion 1",
"status": "online",
"last_latitude": 46.204, "last_longitude": 6.143,
"last_speed": 0, "last_heading": 180, "last_battery": 87,
"last_position_at": "2026-07-11 06:12:33",
"vehicle_plate": "GE 123456", "vehicle_name": "Fourgon",
"active_agent_name": null, "is_shared": false
}
]
}
Variante temps réel : dernières valeurs brutes de chaque tracker actif, idéale pour rafraîchir une carte.
Jours pour lesquels au moins un des IMEI donnés a des positions (utile pour un sélecteur de dates).
Query
| Param | Requis | Description |
|---|---|---|
imeis | oui | Liste d'IMEI séparés par des virgules |
from | non | Date min YYYY-MM-DD |
to | non | Date max YYYY-MM-DD |
Détails d'un tracker par IMEI + ses 50 dernières positions.
Détails d'un tracker par identifiant interne + ses 50 dernières positions.
Active (enregistre) un tracker sur votre compte par son IMEI.
Body
{ "imei": "350612073912345", "name": "Camion 1" } // name optionnel
Renomme/active un tracker et met à jour le véhicule associé (créé si besoin).
Body (tous les champs optionnels)
{
"name": "Camion 1", "is_active": true,
"vehicle_plate": "GE 123456", "vehicle_name": "Fourgon",
"vehicle_type": "van", "vehicle_model": "Ford Transit",
"vehicle_color": "#2563eb", "vehicle_assigned_to": "Jean"
}
Supprime un tracker du compte (positions et alertes associées nettoyées, véhicule dissocié).
Positions GPS
Dernière position connue de chacun de vos trackers (une ligne par device).
Flux de positions récentes, filtrable par IMEI.
Query
| Param | Défaut | Description |
|---|---|---|
imei | — | Filtre sur un tracker |
limit | 100 | Nombre max de points |
Historique des positions d'un tracker, avec adresses géocodées optionnelles.
Query
| Param | Défaut | Description |
|---|---|---|
limit | 100 | Nombre max de points |
from | — | Borne min (server_timestamp) |
to | — | Borne max |
address | true | false pour désactiver le géocodage inverse |
Export paginé de l'historique brut d'un tracker (5000 points par page).
Query
| Param | Requis | Description |
|---|---|---|
imei | oui | Tracker à exporter |
from/to | non | Plage temporelle |
page | non | Index de page (0 par défaut) |
Réponse
{ "success": true, "imei": "…", "page": 0, "page_size": 5000,
"count": 5000, "has_more": true, "positions": [ … ] }
Positions d'un tracker via son identifiant interne.
Positions de secours par localisation cellulaire (SIM) quand le GPS est indisponible.
Ingestion d'une position (appelée par les trackers/passerelles). Rarement utile pour une intégration cliente.
Champs d'une position
| Champ | Description |
|---|---|
latitude, longitude | Coordonnées WGS84 |
speed | Vitesse (km/h) |
heading / angle | Cap (degrés) |
altitude | Altitude (m) |
satellites, hdop | Qualité du fix GPS |
ignition, movement | Contact / mouvement (0/1) |
battery_level, gsm_signal | Batterie et signal réseau |
server_timestamp | Horodatage serveur (YYYY-MM-DD HH:MM:SS, UTC) |
Véhicules
Fiche véhicule reliée à un tracker (plaque, modèle, couleur, personne assignée).
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /vehicles | Lister vos véhicules |
| GET | /vehicles/{id} | Détail d'un véhicule |
| POST | /vehicles | Créer un véhicule |
| PUT | /vehicles/{id} | Modifier un véhicule |
| DELETE | /vehicles/{id} | Supprimer un véhicule |
Body (POST/PUT)
{
"plate": "GE 123456", "name": "Fourgon",
"vehicle_type": "van", "vehicle_model": "Ford Transit",
"color": "#2563eb", "device_id": 12, "assigned_to": "Jean"
}
Geofences
Zones circulaires déclenchant des alertes à l'entrée et/ou à la sortie.
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /geofences | Lister vos zones |
| GET | /geofences/{id} | Détail d'une zone |
| POST | /geofences | Créer une zone |
| PUT | /geofences/{id} | Modifier une zone |
| DELETE | /geofences/{id} | Supprimer une zone |
Body (POST/PUT)
{
"name": "Dépôt Genève",
"latitude": 46.204, "longitude": 6.143, "radius": 150,
"type": "vehicle", // ou "general"
"vehicle_id": 12, // requis si type = "vehicle"
"color": "#ef4444",
"alert_on_enter": true, "alert_on_exit": true,
"description": "Zone de stationnement"
}
Affectations d'agents
Gérez vos agents (promoteurs/chauffeurs) et l'attribution des trackers à un agent pour une session.
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /assignments/agents | Lister les agents |
| POST | /assignments/agents | Créer un agent |
| PUT PATCH | /assignments/agents/{id} | Modifier un agent |
| DELETE | /assignments/agents/{id} | Supprimer un agent |
| GET | /assignments/devices/{imei}/current | Agent actuellement affecté à un tracker |
| GET | /assignments/devices/{imei}/history | Historique des affectations |
| POST | /assignments/devices/{imei}/assign | Affecter un agent à un tracker |
| POST | /assignments/devices/{imei}/unassign | Libérer le tracker |
Alertes
Règles de notification (batterie faible, survitesse, entrée/sortie de zone, etc.).
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /manager/alerts | Lister les alertes |
| POST | /manager/alerts | Créer une alerte |
| PUT | /manager/alerts/{id} | Modifier une alerte |
| DELETE | /manager/alerts/{id} | Supprimer une alerte |
Share-links (partage public)
Créez des liens de partage temporaires permettant de suivre certains trackers sans compte.
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /manager/share-links | Lister vos liens |
| POST | /manager/share-links | Créer un lien (IMEI + expiration) |
| PUT | /manager/share-links/{id} | Modifier / (dés)activer |
| DELETE | /manager/share-links/{id} | Révoquer un lien |
Rapports
Rapports planifiés (PDF) et suivi de leurs exécutions.
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /manager/reports | Lister les rapports configurés |
| POST | /manager/reports | Créer un rapport planifié |
| POST | /manager/reports/autoconfig | Configuration automatique |
| PUT | /manager/reports/{id} | Modifier un rapport |
| DELETE | /manager/reports/{id} | Supprimer un rapport |
| POST | /manager/reports/{id}/run-now | Générer immédiatement |
| GET | /manager/reports/{id}/runs | Exécutions d'un rapport |
| GET | /manager/report-runs | Toutes les exécutions récentes |
| GET | /manager/report-configs | Lister les configs |
| POST | /manager/report-configs | Créer une config |
Notifications & réglages
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /manager/notifications | Lister les notifications |
| POST | /manager/notifications/{id}/read | Marquer comme lue |
| GET | /manager/settings | Réglages du compte |
| PUT | /manager/settings | Modifier les réglages |
| PUT | /manager/profile | Modifier le profil manager |
| GET | /manager/geofences | Geofences (vue manager) |
Partage public
Résout un share-link : retourne les trackers/IMEI partagés et l'expiration. Aucun jeton requis.
Réponse
{ "success": true, "devices": [ … ], "imeis": ["…"], "expires_at": "…" }
Géocodage inverse
Convertit des coordonnées en adresse (avec cache serveur).
Query
/geocode?latitude=46.204&longitude=6.143
Réponse
{ "code": 1, "address": "…", "street": "…", "postal_code": "…", "city": "Genève", "country": "CH" }
Conventions — réponses JSON
Les réponses réussies portent généralement success: true et la ressource (ou une liste).
{ "success": true, "devices": [ … ] }
Erreurs
Les erreurs renvoient un statut HTTP adéquat et un corps { "error": "message" }.
| Statut | Signification |
|---|---|
400 | Requête invalide (paramètre manquant / format) |
401 | Jeton manquant, invalide ou expiré |
403 | Accès refusé à cette ressource (ex. tracker d'un autre compte) |
404 | Ressource ou endpoint introuvable |
500 | Erreur serveur |
Pagination
Les listes de positions se limitent via limit. L'export d'historique
(/positions/export) est paginé par pages de 5000 points : itérez sur
page tant que has_more est true.
Dates & fuseaux
- Les jetons/sessions utilisent l'ISO 8601 UTC (
2026-07-11T06:12:33.000Z). - Les horodatages de positions (
server_timestamp) sont au formatYYYY-MM-DD HH:MM:SSen UTC. - Les filtres
from/toacceptent le même format que le champ ciblé.
403. Conservez le jeton côté serveur ; ne l'exposez pas dans un
front public.