> Índice completo de la documentación: https://trackerintl.com/devs/llms.txt
> Esta página en HTML: https://trackerintl.com/devs/referencia/historial-y-rutas
> Estado: Verificado, revisada el 2026-10-05. Verificado por lectura del código y diff contra producción; las respuestas se midieron con 61 posiciones ficticias en un entorno de pruebas. El rango máximo de 31 días es el valor por defecto del código, no una medición de producción.

# Historial y rutas

Recorrido de un vehículo por tramos de conducción y parada, y posiciones GPS crudas paginadas. Rango máximo, zona horaria y ejemplos.

Hay dos formas de consultar el historial de un vehículo:

| Necesitas | Usa |
|---|---|
| El recorrido resumido: tramos de conducción y paradas, distancia y velocidades | `get_history` |
| Las posiciones GPS una por una, con sus atributos, paginadas | `get_history_messages` |

## Tramos del recorrido

En `get_history`, cada elemento de `items` es un tramo. Su campo `status` indica el tipo:

| `status` | Significado |
|---|---|
| `1` | Conducción |
| `2` | Parada |
| `3` | Inicio |
| `4` | Fin |
| `5` | Evento |

Cada tramo trae sus puntos en `items`, con `lat`, `lng`, `speed` y las horas. Los totales del periodo (`distance_sum`, `top_speed`, `move_duration`, `stop_duration`…) vienen con su unidad, como texto.

## Fechas

Las fechas y horas que envías se interpretan en la zona horaria de tu cuenta. En cada posición, `raw_time` y `time` salen en la zona de la cuenta, mientras que `device_time` y `server_time` vienen crudos en UTC. Mira [Convenciones](/devs/convenciones).

## Recorrido de un vehículo por tramos de conducción/parada

**GET** `/api/get_history` · Estado: Verificado

Reconstruye el recorrido de un vehículo en tramos de conducción y de parada. Identifica el vehículo con `device_id` o con `imei`. Las fechas y horas se interpretan en la zona horaria de la cuenta, no en UTC. Rango máximo de 31 días (valor por defecto del código; el de producción no está confirmado). Requiere permiso de historial, que el vehículo sea del usuario y que no esté vencido.

Autenticación. Cabecera `user-api-hash` con tu `user_api_hash`.

- Dentro de cada posición, `raw_time` y `time` están en la zona de la cuenta, mientras que `device_time` y `server_time` vienen crudos en UTC.

### Parámetros

| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| `device_id` | query | integer | No | Obligatorio si no se envía imei. |
| `imei` | query | string | No | Alternativa a device_id. |
| `from_date` | query | string | Sí | Fecha inicial YYYY-MM-DD. Zona horaria: la de la cuenta del usuario de la API, no UTC. Formato de visualización: el configurado en la cuenta (en las mediciones fue dd-mm-YYYY HH:mm:ss). |
| `from_time` | query | string | Sí | Hora inicial HH:MM o HH:MM:SS (validación: regex). |
| `to_date` | query | string | Sí | Fecha final YYYY-MM-DD. |
| `to_time` | query | string | Sí | Hora final HH:MM o HH:MM:SS. |
| `stops` | query | integer | No | Segundos mínimos para considerar una parada (por defecto 180). |
| `lang` | query | string | No | Idioma de los textos traducibles (SetLang). También se admite la cabecera Accept-Language. |

### Ejemplo de solicitud

cURL:

```bash
curl -sS -G "https://plataforma.trackerintl.com/api/get_history" \
  -H "user-api-hash: TU_API_HASH" \
  --data-urlencode "device_id=9001" \
  --data-urlencode "from_date=2026-10-01" \
  --data-urlencode "from_time=00:00" \
  --data-urlencode "to_date=2026-10-02" \
  --data-urlencode "to_time=23:59"
```

JavaScript:

```javascript
const BASE_URL = "https://plataforma.trackerintl.com";
const API_HASH = "TU_API_HASH";

const params = new URLSearchParams({
  device_id: "9001",
  from_date: "2026-10-01",
  from_time: "00:00",
  to_date: "2026-10-02",
  to_time: "23:59",
});
const respuesta = await fetch(`${BASE_URL}/api/get_history?${params}`, {
  headers: { "user-api-hash": API_HASH },
});
if (!respuesta.ok) throw new Error(`HTTP ${respuesta.status}: ${await respuesta.text()}`);
console.log(JSON.stringify(await respuesta.json(), null, 2));
```

Python:

```python
import json
import requests

BASE_URL = "https://plataforma.trackerintl.com"
API_HASH = "TU_API_HASH"

respuesta = requests.get(
    f"{BASE_URL}/api/get_history",
    headers={"user-api-hash": API_HASH},
    params={"device_id": "9001", "from_date": "2026-10-01", "from_time": "00:00", "to_date": "2026-10-02", "to_time": "23:59"},
    timeout=30,
)
respuesta.raise_for_status()
print(json.dumps(respuesta.json(), indent=2, ensure_ascii=False))
```

PHP:

```php
<?php
$baseUrl = "https://plataforma.trackerintl.com";
$apiHash = "TU_API_HASH";

$url = $baseUrl . "/api/get_history?" . http_build_query(["device_id" => "9001", "from_date" => "2026-10-01", "from_time" => "00:00", "to_date" => "2026-10-02", "to_time" => "23:59"]);
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => ["user-api-hash: " . $apiHash],
]);
$cuerpo = curl_exec($ch);
$codigo = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($cuerpo === false || $codigo !== 200) {
    fwrite(STDERR, "HTTP $codigo\n");
    exit(1);
}
echo json_encode(json_decode($cuerpo, true), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), "\n";
```

### Respuestas

| Código | Descripción |
|---|---|
| `200` | Respuesta correcta. |
| `401` | Hash ausente o incorrecto, usuario inactivo, suscripción vencida (también la del gerente) o API deshabilitada por falta de pago del servidor. HTTP 401 con `{status: 0, message}`. |
| `403` | Sin permiso del rol para el módulo, vehículo de otro usuario o cuenta restringida por facturación. Incluye `perm: 0`. |
| `404` | Dispositivo inexistente: message "\"Device\" was not found.". |
| `422` | Faltan parámetros, formato de hora inválido, rango > 31 días o vehículo vencido. |
| `500` | Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico. |

| Campo (respuesta 200) | Tipo | Descripción |
|---|---|---|
| `items` | array de HistoryItem |  |
| `device` | object | Vehículo consultado, con sus sensores. |
| `distance_sum` | string | Con unidad: "9.2 Km". |
| `top_speed` | string | "31 kph". |
| `move_duration` | string |  |
| `stop_duration` | string |  |
| `engine_hours` | string |  |
| `engine_idle` | string |  |
| `engine_work` | string |  |
| `fuel_consumption` | string \| null |  |
| `sensors` | array de object |  |
| `fuel_consumption_arr` | array de  |  |
| `item_class` | array de object |  |
| `images` | array de object |  |
| `status` |  |  |

Ejemplo de respuesta 200 (datos ficticios):

```json
{
  "items": [
    {
      "status": 3,
      "time": null,
      "show": "01-10-2026 08:00:00",
      "raw_time": "2026-10-01 08:00:00",
      "distance": 0,
      "driver": null,
      "items": [
        {
          "id": 500,
          "device_id": 9001,
          "item_id": "i500",
          "time": "01-10-2026 08:00:00",
          "raw_time": "2026-10-01 08:00:00",
          "altitude": 400,
          "course": 90,
          "speed": 27,
          "latitude": -17.78,
          "longitude": -63.18,
          "lat": -17.78,
          "lng": -63.18,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:00:00",
          "server_time": "2026-10-01 12:00:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 27
            },
            {
              "id": "altitude",
              "value": 400
            }
          ]
        }
      ]
    },
    {
      "status": 1,
      "index": 1,
      "time": "40min 0s",
      "show": "01-10-2026 08:00:00",
      "left": "01-10-2026 08:40:00",
      "raw_time": "2026-10-01 08:00:00",
      "distance": 2.91,
      "time_seconds": 2400,
      "engine_work": 2280,
      "engine_idle": 0,
      "engine_hours": 2280,
      "fuel_consumption": null,
      "top_speed": 27,
      "average_speed": 27,
      "driver": null,
      "items": [
        {
          "id": 500,
          "device_id": 9001,
          "item_id": "i500",
          "time": "01-10-2026 08:00:00",
          "raw_time": "2026-10-01 08:00:00",
          "altitude": 400,
          "course": 90,
          "speed": 27,
          "latitude": -17.78,
          "longitude": -63.18,
          "lat": -17.78,
          "lng": -63.18,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:00:00",
          "server_time": "2026-10-01 12:00:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 27
            },
            {
              "id": "altitude",
              "value": 400
            }
          ]
        },
        {
          "id": 501,
          "device_id": 9001,
          "item_id": "i501",
          "time": "01-10-2026 08:02:00",
          "raw_time": "2026-10-01 08:02:00",
          "altitude": 401,
          "course": 90,
          "speed": 27,
          "latitude": -17.779,
          "longitude": -63.179,
          "lat": -17.779,
          "lng": -63.179,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:02:00",
          "server_time": "2026-10-01 12:02:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 27
            },
            {
              "id": "altitude",
              "value": 401
            }
          ]
        },
        {
          "id": 502,
          "device_id": 9001,
          "item_id": "i502",
          "time": "01-10-2026 08:04:00",
          "raw_time": "2026-10-01 08:04:00",
          "altitude": 402,
          "course": 90,
          "speed": 27,
          "latitude": -17.778000000000002,
          "longitude": -63.178,
          "lat": -17.778000000000002,
          "lng": -63.178,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:04:00",
          "server_time": "2026-10-01 12:04:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 27
            },
            {
              "id": "altitude",
              "value": 402
            }
          ]
        },
        {
          "id": 503,
          "device_id": 9001,
          "item_id": "i503",
          "time": "01-10-2026 08:06:00",
          "raw_time": "2026-10-01 08:06:00",
          "altitude": 403,
          "course": 90,
          "speed": 27,
          "latitude": -17.777,
          "longitude": -63.177,
          "lat": -17.777,
          "lng": -63.177,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:06:00",
          "server_time": "2026-10-01 12:06:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 27
            },
            {
              "id": "altitude",
              "value": 403
            }
          ]
        },
        {
          "id": 504,
          "device_id": 9001,
          "item_id": "i504",
          "time": "01-10-2026 08:08:00",
          "raw_time": "2026-10-01 08:08:00",
          "altitude": 404,
          "course": 90,
          "speed": 27,
          "latitude": -17.776,
          "longitude": -63.176,
          "lat": -17.776,
          "lng": -63.176,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:08:00",
          "server_time": "2026-10-01 12:08:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 27
            },
            {
              "id": "altitude",
              "value": 404
            }
          ]
        }
      ]
    },
    {
      "status": 2,
      "index": 1,
      "time": "30min 0s",
      "show": "01-10-2026 08:40:00",
      "left": "01-10-2026 09:10:00",
      "raw_time": "2026-10-01 08:40:00",
      "distance": 0,
      "time_seconds": 1800,
      "engine_work": 0,
      "engine_idle": 0,
      "engine_hours": 0,
      "fuel_consumption": null,
      "top_speed": 0,
      "average_speed": 0,
      "driver": null,
      "items": [
        {
          "id": 520,
          "device_id": 9001,
          "item_id": "i520",
          "time": "01-10-2026 08:40:00",
          "raw_time": "2026-10-01 08:40:00",
          "altitude": 420,
          "course": 90,
          "speed": 0,
          "latitude": -17.76,
          "longitude": -63.16,
          "lat": -17.76,
          "lng": -63.16,
          "distance": 0,
          "other": "<info><ignition>0</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:40:00",
          "server_time": "2026-10-01 12:40:00",
          "other_arr": [
            "ignition: 0"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 0
            },
            {
              "id": "altitude",
              "value": 420
            }
          ]
        },
        {
          "id": 521,
          "device_id": 9001,
          "item_id": "i521",
          "time": "01-10-2026 08:42:00",
          "raw_time": "2026-10-01 08:42:00",
          "altitude": 421,
          "course": 90,
          "speed": 0,
          "latitude": -17.759,
          "longitude": -63.159,
          "lat": -17.759,
          "lng": -63.159,
          "distance": 0,
          "other": "<info><ignition>0</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:42:00",
          "server_time": "2026-10-01 12:42:00",
          "other_arr": [
            "ignition: 0"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 0
            },
            {
              "id": "altitude",
              "value": 421
            }
          ]
        },
        {
          "id": 522,
          "device_id": 9001,
          "item_id": "i522",
          "time": "01-10-2026 08:44:00",
          "raw_time": "2026-10-01 08:44:00",
          "altitude": 422,
          "course": 90,
          "speed": 0,
          "latitude": -17.758000000000003,
          "longitude": -63.158,
          "lat": -17.758000000000003,
          "lng": -63.158,
          "distance": 0,
          "other": "<info><ignition>0</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 12:44:00",
          "server_time": "2026-10-01 12:44:00",
          "other_arr": [
            "ignition: 0"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 0
            },
            {
              "id": "altitude",
              "value": 422
            }
          ]
        }
      ]
    },
    {
      "status": 1,
      "index": 2,
      "time": "48min 0s",
      "show": "01-10-2026 09:10:00",
      "left": "01-10-2026 09:58:00",
      "raw_time": "2026-10-01 09:10:00",
      "distance": 6.29,
      "time_seconds": 2880,
      "engine_work": 2880,
      "engine_idle": 0,
      "engine_hours": 2880,
      "fuel_consumption": null,
      "top_speed": 31,
      "average_speed": 29,
      "driver": null,
      "items": [
        {
          "id": 535,
          "device_id": 9001,
          "item_id": "i535",
          "time": "01-10-2026 09:10:00",
          "raw_time": "2026-10-01 09:10:00",
          "altitude": 435,
          "course": 90,
          "speed": 31,
          "latitude": -17.745,
          "longitude": -63.145,
          "lat": -17.745,
          "lng": -63.145,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 13:10:00",
          "server_time": "2026-10-01 13:10:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 31
            },
            {
              "id": "altitude",
              "value": 435
            }
          ]
        },
        {
          "id": 536,
          "device_id": 9001,
          "item_id": "i536",
          "time": "01-10-2026 09:12:00",
          "raw_time": "2026-10-01 09:12:00",
          "altitude": 436,
          "course": 90,
          "speed": 31,
          "latitude": -17.744,
          "longitude": -63.144,
          "lat": -17.744,
          "lng": -63.144,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 13:12:00",
          "server_time": "2026-10-01 13:12:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 31
            },
            {
              "id": "altitude",
              "value": 436
            }
          ]
        },
        {
          "id": 537,
          "device_id": 9001,
          "item_id": "i537",
          "time": "01-10-2026 09:14:00",
          "raw_time": "2026-10-01 09:14:00",
          "altitude": 437,
          "course": 90,
          "speed": 31,
          "latitude": -17.743000000000002,
          "longitude": -63.143,
          "lat": -17.743000000000002,
          "lng": -63.143,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 13:14:00",
          "server_time": "2026-10-01 13:14:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 31
            },
            {
              "id": "altitude",
              "value": 437
            }
          ]
        },
        {
          "id": 538,
          "device_id": 9001,
          "item_id": "i538",
          "time": "01-10-2026 09:16:00",
          "raw_time": "2026-10-01 09:16:00",
          "altitude": 438,
          "course": 90,
          "speed": 31,
          "latitude": -17.742,
          "longitude": -63.142,
          "lat": -17.742,
          "lng": -63.142,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 13:16:00",
          "server_time": "2026-10-01 13:16:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 31
            },
            {
              "id": "altitude",
              "value": 438
            }
          ]
        }
      ]
    },
    {
      "status": 4,
      "time": null,
      "show": "01-10-2026 09:58:00",
      "raw_time": "2026-10-01 09:58:00",
      "distance": 0,
      "driver": null,
      "items": [
        {
          "id": 538,
          "device_id": 9001,
          "item_id": "i538",
          "time": "01-10-2026 09:16:00",
          "raw_time": "2026-10-01 09:16:00",
          "altitude": 438,
          "course": 90,
          "speed": 31,
          "latitude": -17.742,
          "longitude": -63.142,
          "lat": -17.742,
          "lng": -63.142,
          "distance": 0.12,
          "other": "<info><ignition>1</ignition></info>",
          "color": "#000000",
          "valid": 1,
          "device_time": "2026-10-01 13:16:00",
          "server_time": "2026-10-01 13:16:00",
          "other_arr": [
            "ignition: 1"
          ],
          "sensors_data": [
            {
              "id": "speed",
              "value": 31
            },
            {
              "id": "altitude",
              "value": 438
            }
          ]
        }
      ]
    }
  ],
  "device": {
    "id": 9001,
    "name": "Camioneta de prueba 01",
    "imei": "999000000000001",
    "plate_number": "TEST-001",
    "sensors": [],
    "traccar": {}
  },
  "distance_sum": "9.2 Km",
  "top_speed": "31 kph",
  "move_duration": "1h 28min 0s",
  "stop_duration": "30min 0s",
  "engine_hours": "1h 28min 0s",
  "engine_idle": "0s",
  "engine_work": "1h 28min 0s",
  "fuel_consumption": null,
  "sensors": [
    {
      "id": "speed",
      "name": "Speed",
      "sufix": "kph"
    },
    {
      "id": "altitude",
      "name": "Altitude",
      "sufix": "m"
    }
  ],
  "fuel_consumption_arr": [],
  "item_class": [
    {
      "id": 1,
      "value": "drive",
      "title": "Drive"
    },
    {
      "id": 2,
      "value": "stop",
      "title": "Stop"
    },
    {
      "id": 3,
      "value": "start",
      "title": "Start"
    },
    {
      "id": 4,
      "value": "end",
      "title": "End"
    },
    {
      "id": 5,
      "value": "event",
      "title": "Event"
    }
  ],
  "images": [
    {
      "id": 1,
      "value": "https://example.invalid/assets/images/route_drive.png",
      "title": "https://example.invalid/assets/images/route_drive.png"
    }
  ],
  "status": 1
}
```

### Verificación

Estado: Verificado. Revisado el 5 de octubre de 2026. Ruta confirmada en producción y archivos del flujo idénticos a los verificados (comparación por huella y diff). La forma de la respuesta se midió con datos ficticios en un entorno de pruebas; no se probó con una cuenta real de producción.

## Posiciones GPS crudas paginadas

**GET** `/api/get_history_messages` · Estado: Verificado

Lista las posiciones almacenadas de un vehículo en el rango dado, paginadas. `limit` solo admite 50, 100, 200, 300, 400, 500 o 1000; cualquier otro valor se sustituye por 50 sin avisar. `sorting=true` ordena de la más reciente a la más antigua. A diferencia de `get_history`, no aplica el límite de 31 días y exige `device_id` (no acepta `imei`).

Autenticación. Cabecera `user-api-hash` con tu `user_api_hash`.

- Aunque este endpoint no limita el rango, conviene consultar por tramos de hasta 31 días, igual que `get_history`.

### Parámetros

| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| `device_id` | query | integer | Sí | ID del vehículo (campo id de get_devices). |
| `from_date` | query | string | Sí | Fecha inicial YYYY-MM-DD. Zona horaria: la de la cuenta del usuario de la API, no UTC. Formato de visualización: el configurado en la cuenta (en las mediciones fue dd-mm-YYYY HH:mm:ss). |
| `from_time` | query | string | Sí | Hora inicial HH:MM o HH:MM:SS (validación: regex). |
| `to_date` | query | string | Sí | Fecha final YYYY-MM-DD. |
| `to_time` | query | string | Sí | Hora final HH:MM o HH:MM:SS. |
| `limit` | query | integer (50, 100, 200, 300, 400, 500, 1000) | No | Tamaño de página (valor distinto -> 50). |
| `page` | query | integer | No | Número de página. |
| `sorting` | query | string ("true") | No | true = descendente. |
| `lang` | query | string | No | Idioma de los textos traducibles (SetLang). También se admite la cabecera Accept-Language. |

### Ejemplo de solicitud

cURL:

```bash
curl -sS -G "https://plataforma.trackerintl.com/api/get_history_messages" \
  -H "user-api-hash: TU_API_HASH" \
  --data-urlencode "device_id=9001" \
  --data-urlencode "from_date=2026-10-01" \
  --data-urlencode "from_time=00:00" \
  --data-urlencode "to_date=2026-10-02" \
  --data-urlencode "to_time=23:59" \
  --data-urlencode "limit=100" \
  --data-urlencode "page=1"
```

JavaScript:

```javascript
const BASE_URL = "https://plataforma.trackerintl.com";
const API_HASH = "TU_API_HASH";

const params = new URLSearchParams({
  device_id: "9001",
  from_date: "2026-10-01",
  from_time: "00:00",
  to_date: "2026-10-02",
  to_time: "23:59",
  limit: "100",
  page: "1",
});
const respuesta = await fetch(`${BASE_URL}/api/get_history_messages?${params}`, {
  headers: { "user-api-hash": API_HASH },
});
if (!respuesta.ok) throw new Error(`HTTP ${respuesta.status}: ${await respuesta.text()}`);
console.log(JSON.stringify(await respuesta.json(), null, 2));
```

Python:

```python
import json
import requests

BASE_URL = "https://plataforma.trackerintl.com"
API_HASH = "TU_API_HASH"

respuesta = requests.get(
    f"{BASE_URL}/api/get_history_messages",
    headers={"user-api-hash": API_HASH},
    params={"device_id": "9001", "from_date": "2026-10-01", "from_time": "00:00", "to_date": "2026-10-02", "to_time": "23:59", "limit": "100", "page": "1"},
    timeout=30,
)
respuesta.raise_for_status()
print(json.dumps(respuesta.json(), indent=2, ensure_ascii=False))
```

PHP:

```php
<?php
$baseUrl = "https://plataforma.trackerintl.com";
$apiHash = "TU_API_HASH";

$url = $baseUrl . "/api/get_history_messages?" . http_build_query(["device_id" => "9001", "from_date" => "2026-10-01", "from_time" => "00:00", "to_date" => "2026-10-02", "to_time" => "23:59", "limit" => "100", "page" => "1"]);
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => ["user-api-hash: " . $apiHash],
]);
$cuerpo = curl_exec($ch);
$codigo = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($cuerpo === false || $codigo !== 200) {
    fwrite(STDERR, "HTTP $codigo\n");
    exit(1);
}
echo json_encode(json_decode($cuerpo, true), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), "\n";
```

### Respuestas

| Código | Descripción |
|---|---|
| `200` | Respuesta correcta. |
| `401` | Hash ausente o incorrecto, usuario inactivo, suscripción vencida (también la del gerente) o API deshabilitada por falta de pago del servidor. HTTP 401 con `{status: 0, message}`. |
| `403` | Sin permiso del rol para el módulo, vehículo de otro usuario o cuenta restringida por facturación. Incluye `perm: 0`. |
| `404` | Dispositivo inexistente. |
| `422` | Faltan device_id o fechas. |
| `500` | Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico. |

| Campo (respuesta 200) | Tipo | Descripción |
|---|---|---|
| `messages` | Paginator + object |  |
| `sensors` | array de object |  |
| `pagination_limits` | object |  |
| `limit` | integer |  |
| `sorting` | string ("asc", "desc") |  |
| `parameters` | object |  |
| `status` |  |  |

Ejemplo de respuesta 200 (datos ficticios):

```json
{
  "messages": {
    "current_page": 1,
    "data": [
      {
        "id": 1000,
        "altitude": 400,
        "course": 90,
        "latitude": -17.78,
        "longitude": -63.18,
        "other": "<info><ignition>1</ignition><totaldistance>1000</totaldistance></info>",
        "speed": "27.00",
        "time": "01-10-2026 08:00:00",
        "device_time": "2026-10-01 12:00:00",
        "server_time": "01-10-2026 08:00:00",
        "sensors_values": null,
        "valid": 1,
        "distance": 120,
        "protocol": "gt06",
        "device_id": 9001,
        "other_arr": [
          "ignition: 1",
          "totaldistance: 1000"
        ],
        "other_array": {
          "ignition": "1",
          "totaldistance": "1000"
        },
        "popup_sensors": {
          "70001": {
            "name": "Bateria",
            "value": "87 %"
          }
        },
        "sensors_value": {
          "70001": "87 %"
        }
      },
      {
        "id": 1001,
        "altitude": 401,
        "course": 90,
        "latitude": -17.779,
        "longitude": -63.179,
        "other": "<info><ignition>1</ignition><totaldistance>1000</totaldistance></info>",
        "speed": "27.00",
        "time": "01-10-2026 08:01:00",
        "device_time": "2026-10-01 12:01:00",
        "server_time": "01-10-2026 08:01:00",
        "sensors_values": null,
        "valid": 1,
        "distance": 120,
        "protocol": "gt06",
        "device_id": 9001,
        "other_arr": [
          "ignition: 1",
          "totaldistance: 1000"
        ],
        "other_array": {
          "ignition": "1",
          "totaldistance": "1000"
        },
        "popup_sensors": {
          "70001": {
            "name": "Bateria",
            "value": "87 %"
          }
        },
        "sensors_value": {
          "70001": "87 %"
        }
      }
    ],
    "first_page_url": "https://plataforma.example.invalid/api/get_history_messages?page=1",
    "from": 1,
    "last_page": 3,
    "last_page_url": "https://plataforma.example.invalid/api/get_history_messages?page=3",
    "links": [],
    "next_page_url": "https://plataforma.example.invalid/api/get_history_messages?page=2",
    "path": "https://plataforma.example.invalid/api/get_history_messages",
    "per_page": 50,
    "prev_page_url": null,
    "to": 2,
    "total": 120,
    "url": "https://plataforma.example.invalid/api/get_history_messages"
  },
  "sensors": [],
  "pagination_limits": {
    "50": 50,
    "100": 100,
    "200": 200,
    "300": 300,
    "400": 400,
    "500": 500,
    "1000": 1000
  },
  "limit": 50,
  "sorting": "asc",
  "parameters": {
    "ignition": "",
    "totaldistance": ""
  },
  "status": 1
}
```

### Verificación

Estado: Verificado. Revisado el 5 de octubre de 2026. Ruta confirmada en producción y archivos del flujo idénticos a los verificados (comparación por huella y diff). La forma de la respuesta se midió con datos ficticios en un entorno de pruebas; no se probó con una cuenta real de producción.
