Saltar al contenido

Referencia API

Referencia de la API HTTP y WebSocket del servidor de Trucks-MDT: autenticación, rutas y telemetría.

Introducción

El servidor de Trucks-MDT expone una API HTTP con JSON, más un WebSocket para eventos en vivo. La usan la tablet, el cliente de escritorio y el panel web. La versión actual de la API es 1.0.

ElementoValor
URL baseLa dirección del servidor (PUBLIC_URL). En desarrollo, http://localhost:3000
FormatoJSON. Las peticiones con cuerpo deben enviar Content-Type: application/json
WebSocket/ws: empuja eventos a los paneles (cookie de sesión) y al cliente (token Bearer)

Errores

Toda respuesta de error usa el mismo formato, con el código HTTP correspondiente:

{
  "error": {
    "code": "BAD_CSRF",
    "message": "Token CSRF inválido o ausente",
    "details": null
  }
}
CódigoHTTPCuándo
UNSUPPORTED_MEDIA_TYPE415El cuerpo no es application/json
BAD_CSRF403Falta o es inválido el token CSRF en una petición que modifica datos
LICENSE_REQUIRED402El modo empresa necesita una licencia válida para este servidor (falta, venció, es de otra IP o fue revocada). Los conductores no se ven afectados
NOT_FOUND404La ruta o el recurso no existe
METHOD_NOT_ALLOWED405La ruta existe pero no con ese método
INTERNAL500Error interno del servidor

Autenticación

Cada ruta acepta uno de estos mecanismos, indicado en la columna Auth de las tablas:

Sesión (cookie)

Se inicia con POST /api/auth/login, que responde con el usuario y un csrf_token y guarda una cookie HttpOnly. Las peticiones que modifican datos (POST, PATCH, DELETE) deben enviar ese token en la cabecera X-CSRF-Token. Puedes recuperarlo con GET /api/auth/me.

POST /api/auth/login
Content-Type: application/json

{ "email": "conductor@ejemplo.com", "password": "********" }

→ 200
{ "user": { … }, "csrf_token": "…" }

Si la cuenta usa verificación en dos pasos, añade el campo totp con el código.

Token de instalación (Bearer)

El cliente de escritorio se identifica con un token de instalación, que empieza por ets2_ y se envía como Authorization: Bearer ets2_…. Opcionalmente puede enviar X-Client-Version. El token se crea desde la sesión con POST /api/integration/installations y solo se muestra en claro esa vez; caduca a los 90 días por defecto y puede rotarse o revocarse.

Rutas con «Sesión o instalación»

Aceptan ambos mecanismos: se usa el Bearer si se envía la cabecera Authorization, y si no, la cookie de sesión.


Límites de uso

El servidor limita las peticiones. Estos son los valores por defecto, ajustables en la configuración del servidor:

LímitePor defectoVariable
Peticiones globales por minuto600RATE_GLOBAL_PER_MINUTE
Autenticación por minuto10RATE_AUTH_PER_MINUTE
Registros por hora10RATE_REGISTER_PER_HOUR
Telemetría por minuto (por instalación)240RATE_TELEMETRY_PER_MINUTE

Algunas rutas tienen además su propio límite: por ejemplo, 10 instalaciones por hora, 30 invitaciones por hora, 30 envíos de mercado por minuto y 20 cambios de avatar por hora.


Estado del servidor

MétodoRutaAuthDescripción
GET/api/healthNingunaComprueba que el servidor responde. Devuelve { ok, service, time }
GET/api/versionNingunaVersión de la API, versión mínima del cliente, juegos habilitados y ruta del WebSocket
GET/api/meta/ratesNingunaTipos de cambio desde el euro (60 peticiones por minuto)

Marca y licencia

La marca (nombre, logotipo, textos y colores) y la licencia del modo empresa se leen y se cambian con estas rutas. Solo el dueño puede modificarlas.

MétodoRutaAuthDescripción
GET/api/brandNingunaMarca actual: la usan la tablet y el cliente al arrancar
POST/api/brandSesión (dueño)Guarda la marca. El logotipo va como imagen en el propio cuerpo (con tamaño máximo)
POST/api/brand/resetSesión (dueño)Restablece la marca de fábrica
GET/api/licenseNingunaEstado de la licencia: state (ok, ausente, vencida, otra_ip, sin_verificar, revocada…), licenciatario y vencimiento
POST/api/licenseSesión (dueño)Instala el archivo de licencia (campo license, el texto del archivo). Verifica la firma y la IP del servidor

Las rutas del modo empresa responden 402 LICENSE_REQUIRED mientras la licencia no esté ok. Cada pocas horas el servidor avisa a PHILIP Studio con su licencia, su versión y cuatro contadores (conductores, dueños, empresas y trabajos de 30 días); si la licencia fue revocada, el estado pasa a revocada. Mira Instalación.


Cuenta y sesión

MétodoRutaAuthDescripción
POST/api/auth/registerNingunaCrea una cuenta
POST/api/auth/verify-emailNingunaVerifica el correo con el token recibido
POST/api/auth/resend-verificationNingunaReenvía el correo de verificación
POST/api/auth/loginNingunaInicia sesión. Cuerpo: email, password, totp (opcional)
POST/api/auth/logoutSesiónCierra la sesión
GET/api/auth/meSesiónUsuario actual y token CSRF
POST/api/auth/forgot-passwordNingunaSolicita el correo de recuperación de contraseña
POST/api/auth/reset-passwordNingunaEstablece una contraseña nueva con el token de recuperación
POST/api/auth/change-passwordSesiónCambia la contraseña
PATCH/api/auth/preferencesSesiónActualiza las preferencias del usuario
POST/api/me/avatarSesiónSube la foto de perfil (campo image, máx. 512 KB)
DELETE/api/me/avatarSesiónQuita la foto de perfil

Steam

MétodoRutaAuthDescripción
POST/api/steam/connectSesiónInicia el vínculo con Steam (inicio de sesión verificado)
POST/api/steam/link-idSesiónVincula escribiendo el SteamID (sin verificar)
GET/api/steam/callbackNingunaRetorno del inicio de sesión de Steam
GET/api/steam/statusSesiónEstado del vínculo, horas y perfil
POST/api/steam/syncSesiónSincroniza los datos de Steam (6 cada 10 minutos)
POST/api/steam/disconnectSesiónDesvincula la cuenta de Steam

Empresa

Estas rutas dependen del rol del usuario dentro de la empresa; el servidor responde con error si no tiene permiso. :id es el id de la empresa.

MétodoRutaAuthDescripción
GET/api/companiesSesiónEmpresas a las que perteneces
GET/api/companies/:idSesiónDetalle de la empresa
PATCH/api/companies/:idSesiónActualiza la empresa
GET/api/companies/:id/statisticsSesiónPanel de estadísticas de la empresa
GET/api/companies/:id/liveSesiónConductores conectados en vivo
GET/api/companies/:id/driversSesiónLista de conductores
GET/api/companies/:id/drivers/:driverIdSesiónDetalle de un conductor
GET/api/companies/:id/drivers/:driverId/trailSesiónRecorrido reciente de un conductor
POST/api/companies/:id/invitationsSesiónInvita a un conductor (30 por hora)
POST/api/invitations/acceptSesiónAcepta una invitación
PATCH/api/companies/:id/members/:memberIdSesiónCambia el rol o el estado de un miembro
GET/api/companies/:id/vehiclesSesiónLista de vehículos
POST/api/companies/:id/vehiclesSesiónCrea un vehículo
PATCH/api/companies/:id/vehicles/:vidSesiónActualiza un vehículo
POST/api/companies/:id/vehicles/:vid/maintenanceSesiónRegistra un mantenimiento
GET/api/companies/:id/jobsSesiónTrabajos de la empresa (filtro opcional status)
GET/api/companies/:id/financeSesiónResumen financiero
POST/api/companies/:id/finance/adjustmentsSesiónRegistra un ajuste financiero
GET/api/companies/:id/violationsSesiónMultas (filtro status: PENDIENTE, PAGADA, ANULADA)
PATCH/api/companies/:id/violations/:vidSesiónActualiza una multa
GET/api/companies/:id/incidentsSesiónAccidentes
GET/api/companies/:id/fraud-alertsSesiónAlertas de coherencia (filtro status: abierta, revisada, descartada)
PATCH/api/companies/:id/fraud-alerts/:aidSesiónCambia el estado de una alerta
GET/api/companies/:id/settingsSesiónPolítica de realismo y ajustes de la empresa
PATCH/api/companies/:id/settingsSesiónActualiza los ajustes
GET/api/companies/:id/auditSesiónRegistro de auditoría
POST/api/companies/:id/catalog/:kindSesiónAñade elementos al catálogo de la empresa

Trabajos y despacho

MétodoRutaAuthDescripción
POST/api/jobsSesiónCrea un trabajo
GET/api/jobsSesiónLista de trabajos
GET/api/jobs/:idSesiónDetalle de un trabajo
POST/api/jobs/:id/offerSesiónOfrece el trabajo a un conductor
POST/api/jobs/:id/acceptSesión o instalaciónEl conductor acepta el trabajo
POST/api/jobs/:id/rejectSesión o instalaciónEl conductor rechaza el trabajo
POST/api/jobs/:id/startSesiónInicia el trabajo manualmente
POST/api/jobs/:id/completeSesiónCompleta el trabajo
POST/api/jobs/:id/cancelSesiónCancela el trabajo
POST/api/jobs/:id/resumeSesiónReanuda un trabajo
GET/api/dispatch/pendingSesión o instalaciónDespachos pendientes del conductor
POST/api/dispatch/:id/acknowledgeSesión o instalaciónConfirma que el despacho fue visto

Conductor

MétodoRutaAuthDescripción
GET/api/driver/meSesión o instalaciónPerfil del conductor
GET/api/driver/jobsSesión o instalaciónTrabajos del conductor (?scope=mine o ?scope=history)
GET/api/driver/jobs/:idSesión o instalaciónDetalle de un trabajo del conductor
PATCH/api/driver/statusSesiónCambia el estado del conductor
GET/api/driver/statsSesión o instalaciónEstadísticas del conductor
GET/api/driver/violationsSesión o instalaciónMultas del conductor
GET/api/driver/incidentsSesiónIncidentes del conductor
GET/api/driver/fuelSesiónConsumo de combustible
GET/api/driver/vehicleSesiónVehículo asignado
GET/api/driver/companiesSesión o instalaciónEmpresas del conductor
GET/api/driver/hoursSesiónHoras de conducción
GET/api/driver/game-profilesSesiónPerfiles del juego asociados a cada empresa
POST/api/driver/game-profilesSesiónAsocia un perfil del juego a una empresa

Mercado de fletes

MétodoRutaAuthDescripción
POST/api/driver/marketInstalaciónEl cliente sube las ofertas de la última partida guardada (máx. 1 MB, 30 por minuto)
GET/api/driver/marketSesiónOfertas del conductor, con filtros
GET/api/companies/:id/market/driversSesiónConductores que tienen mercado
GET/api/companies/:id/marketSesiónMercado de un conductor (?driver_id=)
POST/api/companies/:id/market/:offerId/dispatchSesiónDespacha una oferta del mercado a un conductor

Filtros de GET /api/driver/market: q, origin, destination, cargo, group, body, adr, fragile, valuable, heavy, km_min, km_max, weight_min, weight_max, min_game_min, value_min, sort (value, expires, km, -km, weight, -weight, cargo) y limit.

Subir ofertas

POST /api/driver/market
Authorization: Bearer ets2_…

{
  "game": "ets2",
  "profile": "Mi perfil",
  "save_name": "quicksave",
  "game_time": 123456,
  "saved_at": "2026-09-29T18:00:00Z",
  "offers": [
    {
      "src_company": "…", "src_city": "…",
      "dst_company": "…", "dst_city": "…",
      "cargo": "…", "km": 412.5,
      "expires_in_min": 300, "urgency": 1, "units": 1,
      "truck": "…", "trailer": "…"
    }
  ]
}

Solo src_company, src_city, dst_company, dst_city, cargo y km son obligatorios en cada oferta; el resto es opcional.

Billetera

MétodoRutaAuthDescripción
GET/api/driver/walletSesiónSaldo, facturas pendientes y movimientos del conductor
POST/api/driver/wallet/bills/:id/paySesiónPaga una factura
POST/api/driver/wallet/pay-allSesiónPaga todas las facturas
PATCH/api/driver/walletSesiónActiva o desactiva la billetera ({ "enabled": true })
GET/api/companies/:id/walletsSesiónBilleteras de los conductores de la empresa
GET/api/companies/:id/walletSesiónBilletera de la empresa
POST/api/companies/:id/wallet/bonusSesiónEnvía una bonificación a un conductor
POST/api/companies/:id/wallet/coverSesiónLa empresa paga facturas de conductores
GET/api/companies/:id/fuelSesiónCombustible de la flota

Mensajes y notificaciones

MétodoRutaAuthDescripción
GET/api/messagesSesiónMensajes recibidos
POST/api/messages/read-allSesiónMarca todos los mensajes como leídos
POST/api/messages/:id/readSesiónMarca un mensaje como leído
GET/api/notificationsSesiónNotificaciones
POST/api/notifications/read-allSesiónMarca todas las notificaciones como leídas
POST/api/notifications/:id/readSesiónMarca una notificación como leída
POST/api/push/subscribeSesiónSuscribe el navegador a notificaciones push
POST/api/push/unsubscribeSesiónCancela la suscripción push
GET/api/catalog/mapsSesiónCatálogo de mapas
GET/api/catalog/:kindSesiónCatálogo por tipo

Integración del cliente

MétodoRutaAuthDescripción
GET/api/integration/statusSesiónEstado de la integración del usuario
GET/api/integration/installationsSesiónInstalaciones (equipos vinculados)
POST/api/integration/installationsSesiónCrea una instalación. Cuerpo: { "name": "…" } (2 a 60 caracteres). Devuelve el token una sola vez
DELETE/api/integration/installations/:idSesiónRevoca una instalación
POST/api/integration/installations/:id/rotateSesiónGenera un token nuevo y anula el anterior

Telemetría

El cliente de escritorio abre una sesión de telemetría por cada partida y le envía eventos. Todas estas rutas usan el token de instalación.

MétodoRutaAuthDescripción
POST/api/telemetry/sessionInstalaciónAbre una sesión y devuelve su session_id
POST/api/telemetry/eventsInstalaciónEnvía un lote de eventos (máx. 1000 y 512 KB)
POST/api/telemetry/heartbeatInstalaciónMarca que el cliente sigue conectado
POST/api/telemetry/endInstalaciónCierra la sesión

Abrir una sesión

POST /api/telemetry/session
Authorization: Bearer ets2_…

{
  "api_version": "1.0",
  "client_version": "2.0.0",
  "game": { "name": "ets2", "version": "1.55" },
  "plugin": { "name": "…", "version": "…" },
  "environment": {
    "profile": "Mi perfil",
    "mods": [ { "name": "…", "package": "…" } ]
  }
}

game.name puede ser ets2 o ats. plugin y environment son opcionales.

Enviar eventos

POST /api/telemetry/events
Authorization: Bearer ets2_…

{
  "session_id": 42,
  "seq": 1,
  "events": [
    { "t": "2026-09-29T18:00:05Z", "type": "sample", "data": { … } }
  ]
}
Tipo de eventoCuándo se envía
sampleLectura periódica del estado del camión
job_contextContexto del trabajo actual
job_deliveredEntrega completada
job_cancelledTrabajo cancelado
finedMulta
refuelRepostaje
transportTransporte en ferry o tren
tollgatePeaje
profileCambio de perfil del juego

Latido y cierre

POST /api/telemetry/heartbeat
{ "session_id": 42, "rtt_ms": 80, "state": { "game_connected": true, "telemetry_active": true } }

POST /api/telemetry/end
{ "session_id": 42 }
SACA LA ESTRUCUTRA DE ESTOS SITIOS, DIFERENTES HTML Y UN SOLO CSS CON EL CONTENIDO, YO REPMLAZO EL CONTENIDO.. YA QUE ES PARA QUE LA IA PUEDA VER QUEMMOSTRAR SOBRE LE PROGRGA QUE ESTOY HACIENDO