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.

Domainehttps://api.easytrack.ch
FormatJSON UTF-8
AuthJeton Bearer (obtenu par code OTP email)
MéthodesGET, POST, PUT, PATCH, DELETE
CORSActivé (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 /deviceshttps://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
Sans jeton valide Les routes protégées renvoient 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

POST /auth/request-code Public

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 }
POST /auth/verify-code Public

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": "…" }
POST /auth/verify-2fa Public

Finalise la connexion avec le code TOTP (ou un code de secours) et le pending_token.

Body

{ "pending_token": "…", "code": "654321" }
POST /auth/magic-link Public

Envoie un lien de connexion à usage unique par email.

Body

{ "email": "vous@exemple.ch" }
GET /auth/me Bearer

Retourne l'utilisateur associé au jeton courant (utile pour valider une session).

POST /auth/logout Bearer

Invalide la session courante (le jeton n'est plus utilisable).

GET /auth/sessions Bearer

Liste les sessions actives du compte. DELETE /auth/sessions révoque les autres sessions.

Authentification — 2FA & profil

MéthodeEndpointRôle
GET/auth/profileRécupérer le profil
PUT/auth/profileMettre à jour le profil (nom, langue…)
GET/auth/2fa/statusÉtat de la 2FA
POST/auth/2fa/setupGénérer le secret TOTP + QR
POST/auth/2fa/verifyActiver la 2FA (valide un code)
POST/auth/2fa/disableDésactiver la 2FA
POST/auth/2fa/backup-codesRégénérer les codes de secours
POST/auth/push-tokenEnregistrer un token push (mobile)
DELETE/auth/push-tokenSupprimer un token push
GET/auth/notification-preferencesPréférences de notification
PUT/auth/notification-preferencesModifier 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).

GET /devices Bearer

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
    }
  ]
}
GET /devices/realtime Bearer

Variante temps réel : dernières valeurs brutes de chaque tracker actif, idéale pour rafraîchir une carte.

GET /devices/active-days Bearer

Jours pour lesquels au moins un des IMEI donnés a des positions (utile pour un sélecteur de dates).

Query

ParamRequisDescription
imeisouiListe d'IMEI séparés par des virgules
fromnonDate min YYYY-MM-DD
tononDate max YYYY-MM-DD
GET /devices/imei/{imei} Bearer

Détails d'un tracker par IMEI + ses 50 dernières positions.

GET /devices/{id} Bearer

Détails d'un tracker par identifiant interne + ses 50 dernières positions.

POST /devices Bearer

Active (enregistre) un tracker sur votre compte par son IMEI.

Body

{ "imei": "350612073912345", "name": "Camion 1" }   // name optionnel
PUT /devices/{id} Bearer

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"
}
DELETE /devices/{id} Bearer

Supprime un tracker du compte (positions et alertes associées nettoyées, véhicule dissocié).

Positions GPS

GET /positions/latest Bearer

Dernière position connue de chacun de vos trackers (une ligne par device).

GET /positions Bearer

Flux de positions récentes, filtrable par IMEI.

Query

ParamDéfautDescription
imeiFiltre sur un tracker
limit100Nombre max de points
GET /positions/imei/{imei} Bearer

Historique des positions d'un tracker, avec adresses géocodées optionnelles.

Query

ParamDéfautDescription
limit100Nombre max de points
fromBorne min (server_timestamp)
toBorne max
addresstruefalse pour désactiver le géocodage inverse
GET /positions/export Bearer

Export paginé de l'historique brut d'un tracker (5000 points par page).

Query

ParamRequisDescription
imeiouiTracker à exporter
from/tononPlage temporelle
pagenonIndex de page (0 par défaut)

Réponse

{ "success": true, "imei": "…", "page": 0, "page_size": 5000,
  "count": 5000, "has_more": true, "positions": [ … ] }
GET /positions/device/{id} Bearer

Positions d'un tracker via son identifiant interne.

GET /positions/sim/{imei} Bearer

Positions de secours par localisation cellulaire (SIM) quand le GPS est indisponible.

POST /position Public

Ingestion d'une position (appelée par les trackers/passerelles). Rarement utile pour une intégration cliente.

Champs d'une position

ChampDescription
latitude, longitudeCoordonnées WGS84
speedVitesse (km/h)
heading / angleCap (degrés)
altitudeAltitude (m)
satellites, hdopQualité du fix GPS
ignition, movementContact / mouvement (0/1)
battery_level, gsm_signalBatterie et signal réseau
server_timestampHorodatage 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éthodeEndpointRôle
GET/vehiclesLister vos véhicules
GET/vehicles/{id}Détail d'un véhicule
POST/vehiclesCré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éthodeEndpointRôle
GET/geofencesLister vos zones
GET/geofences/{id}Détail d'une zone
POST/geofencesCré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éthodeEndpointRôle
GET/assignments/agentsLister les agents
POST/assignments/agentsCréer un agent
PUT PATCH/assignments/agents/{id}Modifier un agent
DELETE/assignments/agents/{id}Supprimer un agent
GET/assignments/devices/{imei}/currentAgent actuellement affecté à un tracker
GET/assignments/devices/{imei}/historyHistorique des affectations
POST/assignments/devices/{imei}/assignAffecter un agent à un tracker
POST/assignments/devices/{imei}/unassignLibérer le tracker

Alertes

Règles de notification (batterie faible, survitesse, entrée/sortie de zone, etc.).

MéthodeEndpointRôle
GET/manager/alertsLister les alertes
POST/manager/alertsCré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éthodeEndpointRôle
GET/manager/share-linksLister vos liens
POST/manager/share-linksCré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éthodeEndpointRôle
GET/manager/reportsLister les rapports configurés
POST/manager/reportsCréer un rapport planifié
POST/manager/reports/autoconfigConfiguration automatique
PUT/manager/reports/{id}Modifier un rapport
DELETE/manager/reports/{id}Supprimer un rapport
POST/manager/reports/{id}/run-nowGénérer immédiatement
GET/manager/reports/{id}/runsExécutions d'un rapport
GET/manager/report-runsToutes les exécutions récentes
GET/manager/report-configsLister les configs
POST/manager/report-configsCréer une config

Notifications & réglages

MéthodeEndpointRôle
GET/manager/notificationsLister les notifications
POST/manager/notifications/{id}/readMarquer comme lue
GET/manager/settingsRéglages du compte
PUT/manager/settingsModifier les réglages
PUT/manager/profileModifier le profil manager
GET/manager/geofencesGeofences (vue manager)

Partage public

GET /open/share/{token} 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

GET /geocode Bearer

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" }.

StatutSignification
400Requête invalide (paramètre manquant / format)
401Jeton manquant, invalide ou expiré
403Accès refusé à cette ressource (ex. tracker d'un autre compte)
404Ressource ou endpoint introuvable
500Erreur 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

Bon à savoir Chaque compte ne voit que ses propres trackers (et ceux explicitement partagés). Un appel sur un IMEI non autorisé renvoie 403. Conservez le jeton côté serveur ; ne l'exposez pas dans un front public.