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.
| Dominio | https://api.easytrack.ch |
|---|---|
| Formato | JSON UTF-8 |
| Auth | Token Bearer (ottenuto tramite OTP email) |
| Metodi | GET, POST, PUT, PATCH, DELETE |
| CORS | Attivo (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 /devices → https://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
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
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 }
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": "…" }
Completa il login con il codice TOTP (o un codice di backup) e il pending_token.
Body
{ "pending_token": "…", "code": "654321" }
Invia un link di accesso monouso via email.
Body
{ "email": "tu@esempio.ch" }
Restituisce l'utente associato al token corrente (utile per validare una sessione).
Invalida la sessione corrente (il token non è più utilizzabile).
Elenca le sessioni attive dell'account. DELETE /auth/sessions revoca le altre sessioni.
Autenticazione — 2FA & profilo
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /auth/profile | Ottenere il profilo |
| PUT | /auth/profile | Aggiornare il profilo (nome, lingua…) |
| GET | /auth/2fa/status | Stato della 2FA |
| POST | /auth/2fa/setup | Generare secret TOTP + QR |
| POST | /auth/2fa/verify | Attivare la 2FA (valida un codice) |
| POST | /auth/2fa/disable | Disattivare la 2FA |
| POST | /auth/2fa/backup-codes | Rigenerare i codici di backup |
| POST | /auth/push-token | Registrare un token push (mobile) |
| DELETE | /auth/push-token | Rimuovere un token push |
| GET | /auth/notification-preferences | Preferenze di notifica |
| PUT | /auth/notification-preferences | Modificare 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).
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
}
]
}
Variante in tempo reale: ultimi valori grezzi di ogni tracker attivo, ideale per aggiornare una mappa.
Giorni per i quali almeno uno degli IMEI indicati ha posizioni (utile per un selettore di date).
Query
| Parametro | Obbligatorio | Descrizione |
|---|---|---|
imeis | sì | Elenco di IMEI separati da virgole |
from | no | Data min YYYY-MM-DD |
to | no | Data max YYYY-MM-DD |
Dettagli di un tracker per IMEI + le sue ultime 50 posizioni.
Dettagli di un tracker per ID interno + le sue ultime 50 posizioni.
Attiva (registra) un tracker sul tuo account tramite il suo IMEI.
Body
{ "imei": "350612073912345", "name": "Camion 1" } // name opzionale
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"
}
Rimuove un tracker dall'account (posizioni e avvisi collegati ripuliti, veicolo scollegato).
Posizioni GPS
Ultima posizione nota di ciascuno dei tuoi tracker (una riga per dispositivo).
Flusso di posizioni recenti, filtrabile per IMEI.
Query
| Parametro | Predefinito | Descrizione |
|---|---|---|
imei | — | Filtro su un tracker |
limit | 100 | Numero max di punti |
Storico delle posizioni di un tracker, con indirizzi geocodificati opzionali.
Query
| Parametro | Predefinito | Descrizione |
|---|---|---|
limit | 100 | Numero max di punti |
from | — | Limite min (server_timestamp) |
to | — | Limite max |
address | true | false per disattivare la geocodifica inversa |
Export paginato dello storico grezzo di un tracker (5000 punti per pagina).
Query
| Parametro | Obbligatorio | Descrizione |
|---|---|---|
imei | sì | Tracker da esportare |
from/to | no | Intervallo temporale |
page | no | Indice di pagina (0 predefinito) |
Risposta
{ "success": true, "imei": "…", "page": 0, "page_size": 5000,
"count": 5000, "has_more": true, "positions": [ … ] }
Posizioni di un tracker tramite il suo ID interno.
Posizioni di riserva dalla localizzazione cellulare (SIM) quando il GPS non è disponibile.
Acquisizione di una posizione (chiamata dai tracker/gateway). Raramente utile per un'integrazione client.
Campi di una posizione
| Campo | Descrizione |
|---|---|
latitude, longitude | Coordinate WGS84 |
speed | Velocità (km/h) |
heading / angle | Rotta (gradi) |
altitude | Altitudine (m) |
satellites, hdop | Qualità del fix GPS |
ignition, movement | Accensione / movimento (0/1) |
battery_level, gsm_signal | Batteria e segnale di rete |
server_timestamp | Timestamp server (YYYY-MM-DD HH:MM:SS, UTC) |
Veicoli
Scheda veicolo collegata a un tracker (targa, modello, colore, persona assegnata).
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /vehicles | Elencare i tuoi veicoli |
| GET | /vehicles/{id} | Dettaglio di un veicolo |
| POST | /vehicles | Creare 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.
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /geofences | Elencare le tue zone |
| GET | /geofences/{id} | Dettaglio di una zona |
| POST | /geofences | Creare 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.
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /assignments/agents | Elencare gli agenti |
| POST | /assignments/agents | Creare un agente |
| PUT PATCH | /assignments/agents/{id} | Modificare un agente |
| DELETE | /assignments/agents/{id} | Eliminare un agente |
| GET | /assignments/devices/{imei}/current | Agente attualmente assegnato a un tracker |
| GET | /assignments/devices/{imei}/history | Storico delle assegnazioni |
| POST | /assignments/devices/{imei}/assign | Assegnare un agente a un tracker |
| POST | /assignments/devices/{imei}/unassign | Liberare il tracker |
Avvisi
Regole di notifica (batteria scarica, eccesso di velocità, entrata/uscita da una zona, ecc.).
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /manager/alerts | Elencare gli avvisi |
| POST | /manager/alerts | Creare 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.
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /manager/share-links | Elencare i tuoi link |
| POST | /manager/share-links | Creare 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.
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /manager/reports | Elencare i report configurati |
| POST | /manager/reports | Creare un report pianificato |
| POST | /manager/reports/autoconfig | Configurazione automatica |
| PUT | /manager/reports/{id} | Modificare un report |
| DELETE | /manager/reports/{id} | Eliminare un report |
| POST | /manager/reports/{id}/run-now | Generare subito |
| GET | /manager/reports/{id}/runs | Esecuzioni di un report |
| GET | /manager/report-runs | Tutte le esecuzioni recenti |
| GET | /manager/report-configs | Elencare le configurazioni |
| POST | /manager/report-configs | Creare una configurazione |
Notifiche & impostazioni
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /manager/notifications | Elencare le notifiche |
| POST | /manager/notifications/{id}/read | Segnare come letta |
| GET | /manager/settings | Impostazioni account |
| PUT | /manager/settings | Modificare le impostazioni |
| PUT | /manager/profile | Modificare il profilo manager |
| GET | /manager/geofences | Geofence (vista manager) |
Condivisione pubblica
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" }.
| Stato | Significato |
|---|---|
400 | Richiesta non valida (parametro mancante / formato) |
401 | Token mancante, non valido o scaduto |
403 | Accesso negato a questa risorsa (es. tracker di un altro account) |
404 | Risorsa o endpoint non trovato |
500 | Errore 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
- Token/sessioni usano ISO 8601 UTC (
2026-07-11T06:12:33.000Z). - I timestamp delle posizioni (
server_timestamp) usano il formatoYYYY-MM-DD HH:MM:SSin UTC. - I filtri
from/toaccettano lo stesso formato del campo di destinazione.
403. Conserva il token lato server; non esporlo in un front-end
pubblico.