> Índice completo de la documentación: https://trackerintl.com/devs/llms.txt
> Esta página en HTML: https://trackerintl.com/devs/referencia/reportes
> Estado: Verificado, revisada el 2026-10-05. Verificado por lectura del código y diff contra producción; las respuestas se midieron con datos ficticios en un entorno de pruebas. Solo se documentan consultas: generar o descargar reportes queda fuera.

# Reportes

Catálogo de tipos de reporte de tu cuenta y plantillas guardadas. La generación de reportes no está documentada.

Estas operaciones **no generan reportes**. Sirven para saber qué tipos de reporte puede generar tu cuenta y qué plantillas guardó el usuario. La generación y descarga de reportes todavía no está documentada.

## Plantillas de reporte guardadas

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

Lista las plantillas de reporte guardadas por el usuario. No genera reportes. `limit` vale 10 por defecto.

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

### Parámetros

| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| `limit` | query | integer | No |  |
| `page` | query | integer | No | Número de página. |
| `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_reports" \
  -H "user-api-hash: TU_API_HASH" \
  --data-urlencode "limit=10"
```

JavaScript:

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

const params = new URLSearchParams({
  limit: "10",
});
const respuesta = await fetch(`${BASE_URL}/api/get_reports?${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_reports",
    headers={"user-api-hash": API_HASH},
    params={"limit": "10"},
    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_reports?" . http_build_query(["limit" => "10"]);
$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`. |
| `500` | Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico. |

| Campo (respuesta 200) | Tipo | Descripción |
|---|---|---|
| `status` |  |  |
| `items` | object |  |

Ejemplo de respuesta 200 (datos ficticios):

```json
{
  "status": 1,
  "items": {
    "reports": {
      "current_page": 1,
      "data": [],
      "first_page_url": "https://plataforma.example.invalid/api/get_reports?page=1",
      "from": null,
      "last_page": 1,
      "last_page_url": "https://plataforma.example.invalid/api/get_reports?page=1",
      "links": [],
      "next_page_url": null,
      "path": "https://plataforma.example.invalid/api/get_reports",
      "per_page": 10,
      "prev_page_url": null,
      "to": null,
      "total": 0
    },
    "types": [
      {
        "id": 1,
        "title": "General information"
      },
      {
        "id": 2,
        "title": "Stops"
      }
    ]
  }
}
```

### 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.

## Tipos de reporte habilitados para la cuenta

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

Catálogo de los tipos de reporte disponibles para la cuenta: id, nombre, formatos, campos y reglas de validación. La respuesta es grande: unos 128 KB en una cuenta de pruebas con 79 tipos.

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

### Parámetros

| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| `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 "https://plataforma.trackerintl.com/api/get_reports_types" \
  -H "user-api-hash: TU_API_HASH"
```

JavaScript:

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

const respuesta = await fetch(`${BASE_URL}/api/get_reports_types`, {
  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_reports_types",
    headers={"user-api-hash": API_HASH},
    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_reports_types";
$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`. |
| `500` | Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico. |

| Campo (respuesta 200) | Tipo | Descripción |
|---|---|---|
| `status` |  |  |
| `items` | array de ReportType |  |

Ejemplo de respuesta 200 (datos ficticios):

```json
{
  "status": 1,
  "items": [
    {
      "type": 1,
      "name": "General information",
      "formats": [
        "html",
        "xls",
        "pdf",
        "pdf_land",
        "json",
        "csv"
      ],
      "fields": [
        "date_from",
        "date_to"
      ],
      "validation": {
        "type": "required"
      },
      "parameters": []
    },
    {
      "type": 2,
      "name": "Stops",
      "formats": [
        "html",
        "xls",
        "pdf"
      ],
      "fields": [
        "date_from",
        "date_to",
        "stops"
      ],
      "validation": {
        "type": "required"
      },
      "parameters": []
    }
  ]
}
```

### 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.
