Riferimento API EasyTrack

Tutti gli endpoint che puoi integrare nel tuo sistema o app esterna: autenticazione, tracker, posizioni GPS in tempo reale, veicoli, geofence, assegnazioni agenti, avvisi, report e share-link.

Panoramica

L'API EasyTrack è un'API REST JSON ospitata su Cloudflare (edge, regione UE). Tutte le richieste usano HTTPS. Le risposte sono application/json (eccetto export CSV/PDF). I dati di tracciamento in tempo reale provengono dai tracker Teltonika / FMC e sono disponibili pochi secondi dopo la ricezione da parte del server.

Dominiohttps://api.easytrack.ch
FormatoJSON UTF-8
AuthToken Bearer (ottenuto tramite OTP email)
MetodiGET, POST, PUT, PATCH, DELETE
CORSAttivo (Access-Control-Allow-Origin: * sulle risorse principali)

URL di base & formati

https://api.easytrack.ch

Ogni endpoint qui sotto è relativo a questa base. Esempio: GET /deviceshttps://api.easytrack.ch/devices.

Autenticazione

Quasi tutti gli endpoint richiedono un token Bearer. Il token si ottiene in due passaggi: richiesta di un codice OTP via email, poi verifica del codice. Aggiungi quindi l'header Authorization a ogni richiesta:

Authorization: Bearer <il_tuo_token>
Content-Type: application/json
Senza un token valido Le rotte protette restituiscono 401 con {"error":"Token manquant"} o {"error":"Session invalide ou expirée"}. Gli endpoint contrassegnati come Public non richiedono token.

Prima chiamata

1 · Richiedi un codice

curl -X POST https://api.easytrack.ch/auth/request-code \
  -H "Content-Type: application/json" \
  -d '{"email":"tu@esempio.ch","lang":"it"}'

2 · Verifica il codice e ottieni il token

curl -X POST https://api.easytrack.ch/auth/verify-code \
  -H "Content-Type: application/json" \
  -d '{"email":"tu@esempio.ch","code":"123456"}'
# => { "success": true, "token": "…", "expires_at": "…", "user": { … } }

3 · Elenca i tuoi tracker

curl https://api.easytrack.ch/devices \
  -H "Authorization: Bearer <token>"

In JavaScript (fetch):

const res = await fetch("https://api.easytrack.ch/devices", {
  headers: { Authorization: `Bearer ${token}` }
});
const { devices } = await res.json();

Famiglie di endpoint

Autenticazione — login & sessione

POST /auth/request-code Public

Invia un codice OTP di 6 cifre via email (o SMS).

Body

{
  "email": "tu@esempio.ch",
  "lang":  "it"          // opzionale (fr, de, en, it…)
}

Risposta

{ "success": true, "message": "Codice inviato", "expires_in": 600 }
POST /auth/verify-code Public

Verifica l'OTP e restituisce un token Bearer. Se la 2FA è attiva, restituisce requires_2fa.

Body

{ "email": "tu@esempio.ch", "code": "123456" }

Risposta (senza 2FA)

{
  "success": true,
  "token": "…",
  "expires_at": "2026-08-01T10:00:00.000Z",
  "user": { "id": 42, "email": "tu@esempio.ch", "role": "client", "two_factor_enabled": false }
}

Risposta (2FA richiesta)

{ "success": true, "requires_2fa": true, "pending_token": "…" }
POST /auth/verify-2fa Public

Completa il login con il codice TOTP (o un codice di backup) e il pending_token.

Body

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

Invia un link di accesso monouso via email.

Body

{ "email": "tu@esempio.ch" }
GET /auth/me Bearer

Restituisce l'utente associato al token corrente (utile per validare una sessione).

POST /auth/logout Bearer

Invalida la sessione corrente (il token non è più utilizzabile).

GET /auth/sessions Bearer

Elenca le sessioni attive dell'account. DELETE /auth/sessions revoca le altre sessioni.

Autenticazione — 2FA & profilo

MetodoEndpointScopo
GET/auth/profileOttenere il profilo
PUT/auth/profileAggiornare il profilo (nome, lingua…)
GET/auth/2fa/statusStato della 2FA
POST/auth/2fa/setupGenerare secret TOTP + QR
POST/auth/2fa/verifyAttivare la 2FA (valida un codice)
POST/auth/2fa/disableDisattivare la 2FA
POST/auth/2fa/backup-codesRigenerare i codici di backup
POST/auth/push-tokenRegistrare un token push (mobile)
DELETE/auth/push-tokenRimuovere un token push
GET/auth/notification-preferencesPreferenze di notifica
PUT/auth/notification-preferencesModificare le preferenze

Tracker (dispositivi)

Un dispositivo è un tracker GPS identificato dal suo imei. Gli endpoint seguenti restituiscono solo i tracker del tuo account (e quelli condivisi con te).

GET /devices Bearer

Elenco arricchito dei tuoi tracker: ultima posizione, batteria, stato online, veicolo collegato, agente attivo, backup SIM.

Risposta (estratto)

{
  "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": "Furgone",
      "active_agent_name": null, "is_shared": false
    }
  ]
}
GET /devices/realtime Bearer

Variante in tempo reale: ultimi valori grezzi di ogni tracker attivo, ideale per aggiornare una mappa.

GET /devices/active-days Bearer

Giorni per i quali almeno uno degli IMEI indicati ha posizioni (utile per un selettore di date).

Query

ParametroObbligatorioDescrizione
imeisElenco di IMEI separati da virgole
fromnoData min YYYY-MM-DD
tonoData max YYYY-MM-DD
GET /devices/imei/{imei} Bearer

Dettagli di un tracker per IMEI + le sue ultime 50 posizioni.

GET /devices/{id} Bearer

Dettagli di un tracker per ID interno + le sue ultime 50 posizioni.

POST /devices Bearer

Attiva (registra) un tracker sul tuo account tramite il suo IMEI.

Body

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

Rinomina/attiva un tracker e aggiorna il veicolo collegato (creato se necessario).

Body (tutti i campi opzionali)

{
  "name": "Camion 1", "is_active": true,
  "vehicle_plate": "GE 123456", "vehicle_name": "Furgone",
  "vehicle_type": "van", "vehicle_model": "Ford Transit",
  "vehicle_color": "#2563eb", "vehicle_assigned_to": "Marco"
}
DELETE /devices/{id} Bearer

Rimuove un tracker dall'account (posizioni e avvisi collegati ripuliti, veicolo scollegato).

Posizioni GPS

GET /positions/latest Bearer

Ultima posizione nota di ciascuno dei tuoi tracker (una riga per dispositivo).

GET /positions Bearer

Flusso di posizioni recenti, filtrabile per IMEI.

Query

ParametroPredefinitoDescrizione
imeiFiltro su un tracker
limit100Numero max di punti
GET /positions/imei/{imei} Bearer

Storico delle posizioni di un tracker, con indirizzi geocodificati opzionali.

Query

ParametroPredefinitoDescrizione
limit100Numero max di punti
fromLimite min (server_timestamp)
toLimite max
addresstruefalse per disattivare la geocodifica inversa
GET /positions/export Bearer

Export paginato dello storico grezzo di un tracker (5000 punti per pagina).

Query

ParametroObbligatorioDescrizione
imeiTracker da esportare
from/tonoIntervallo temporale
pagenoIndice di pagina (0 predefinito)

Risposta

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

Posizioni di un tracker tramite il suo ID interno.

GET /positions/sim/{imei} Bearer

Posizioni di riserva dalla localizzazione cellulare (SIM) quando il GPS non è disponibile.

POST /position Public

Acquisizione di una posizione (chiamata dai tracker/gateway). Raramente utile per un'integrazione client.

Campi di una posizione

CampoDescrizione
latitude, longitudeCoordinate WGS84
speedVelocità (km/h)
heading / angleRotta (gradi)
altitudeAltitudine (m)
satellites, hdopQualità del fix GPS
ignition, movementAccensione / movimento (0/1)
battery_level, gsm_signalBatteria e segnale di rete
server_timestampTimestamp server (YYYY-MM-DD HH:MM:SS, UTC)

Veicoli

Scheda veicolo collegata a un tracker (targa, modello, colore, persona assegnata).

MetodoEndpointScopo
GET/vehiclesElencare i tuoi veicoli
GET/vehicles/{id}Dettaglio di un veicolo
POST/vehiclesCreare un veicolo
PUT/vehicles/{id}Modificare un veicolo
DELETE/vehicles/{id}Eliminare un veicolo

Body (POST/PUT)

{
  "plate": "GE 123456", "name": "Furgone",
  "vehicle_type": "van", "vehicle_model": "Ford Transit",
  "color": "#2563eb", "device_id": 12, "assigned_to": "Marco"
}

Geofence

Zone circolari che attivano avvisi all'entrata e/o all'uscita.

MetodoEndpointScopo
GET/geofencesElencare le tue zone
GET/geofences/{id}Dettaglio di una zona
POST/geofencesCreare una zona
PUT/geofences/{id}Modificare una zona
DELETE/geofences/{id}Eliminare una zona

Body (POST/PUT)

{
  "name": "Deposito Ginevra",
  "latitude": 46.204, "longitude": 6.143, "radius": 150,
  "type": "vehicle",            // oppure "general"
  "vehicle_id": 12,             // obbligatorio se type = "vehicle"
  "color": "#ef4444",
  "alert_on_enter": true, "alert_on_exit": true,
  "description": "Zona di sosta"
}

Assegnazioni agenti

Gestisci i tuoi agenti (promoter/autisti) e l'attribuzione dei tracker a un agente per una sessione.

MetodoEndpointScopo
GET/assignments/agentsElencare gli agenti
POST/assignments/agentsCreare un agente
PUT PATCH/assignments/agents/{id}Modificare un agente
DELETE/assignments/agents/{id}Eliminare un agente
GET/assignments/devices/{imei}/currentAgente attualmente assegnato a un tracker
GET/assignments/devices/{imei}/historyStorico delle assegnazioni
POST/assignments/devices/{imei}/assignAssegnare un agente a un tracker
POST/assignments/devices/{imei}/unassignLiberare il tracker

Avvisi

Regole di notifica (batteria scarica, eccesso di velocità, entrata/uscita da una zona, ecc.).

MetodoEndpointScopo
GET/manager/alertsElencare gli avvisi
POST/manager/alertsCreare un avviso
PUT/manager/alerts/{id}Modificare un avviso
DELETE/manager/alerts/{id}Eliminare un avviso

Share-link (condivisione pubblica)

Crea link di condivisione temporanei che permettono di seguire determinati tracker senza account.

MetodoEndpointScopo
GET/manager/share-linksElencare i tuoi link
POST/manager/share-linksCreare un link (IMEI + scadenza)
PUT/manager/share-links/{id}Modificare / (dis)attivare
DELETE/manager/share-links/{id}Revocare un link

Report

Report pianificati (PDF) e monitoraggio delle loro esecuzioni.

MetodoEndpointScopo
GET/manager/reportsElencare i report configurati
POST/manager/reportsCreare un report pianificato
POST/manager/reports/autoconfigConfigurazione automatica
PUT/manager/reports/{id}Modificare un report
DELETE/manager/reports/{id}Eliminare un report
POST/manager/reports/{id}/run-nowGenerare subito
GET/manager/reports/{id}/runsEsecuzioni di un report
GET/manager/report-runsTutte le esecuzioni recenti
GET/manager/report-configsElencare le configurazioni
POST/manager/report-configsCreare una configurazione

Notifiche & impostazioni

MetodoEndpointScopo
GET/manager/notificationsElencare le notifiche
POST/manager/notifications/{id}/readSegnare come letta
GET/manager/settingsImpostazioni account
PUT/manager/settingsModificare le impostazioni
PUT/manager/profileModificare il profilo manager
GET/manager/geofencesGeofence (vista manager)

Condivisione pubblica

GET /open/share/{token} Public

Risolve uno share-link: restituisce i tracker/IMEI condivisi e la scadenza. Nessun token richiesto.

Risposta

{ "success": true, "devices": [ … ], "imeis": ["…"], "expires_at": "…" }

Convenzioni — risposte JSON

Le risposte riuscite riportano generalmente success: true e la risorsa (o un elenco).

{ "success": true, "devices": [ … ] }

Errori

Gli errori restituiscono uno stato HTTP adeguato e un corpo { "error": "message" }.

StatoSignificato
400Richiesta non valida (parametro mancante / formato)
401Token mancante, non valido o scaduto
403Accesso negato a questa risorsa (es. tracker di un altro account)
404Risorsa o endpoint non trovato
500Errore del server

Paginazione

Gli elenchi di posizioni si limitano tramite limit. L'export dello storico (/positions/export) è paginato in pagine da 5000 punti: itera su page finché has_more è true.

Date & fusi orari

Da sapere Ogni account vede solo i propri tracker (e quelli esplicitamente condivisi). Una chiamata su un IMEI non autorizzato restituisce 403. Conserva il token lato server; non esporlo in un front-end pubblico.