Referencia de la API

Eventos y alertas

Reglas de alerta, eventos que dispararon y conteo por tipo. Paginación por cursor o por página, filtros y zona horaria.

Estado: Verificado · Revisada el 5 de octubre de 2026

Qué se verificó y cómo: Verificado por lectura del código y diff contra producción; las respuestas se midieron con datos ficticios en un entorno de pruebas. La forma de los horarios de una alerta (`schedules`) no se midió.

Una alerta es una regla configurada en la plataforma (por ejemplo, exceso de velocidad o entrada a una geocerca). Un evento es cada vez que una regla se dispara.

Tabla
NecesitasUsa
Las reglas de alerta del usuarioget_alerts
Los eventos que ocurrieron, del más reciente al más antiguoget_events
Cuántos eventos hubo de cada tipoget_alerts_summary

El campo type de un evento identifica la regla que lo generó: por ejemplo overspeed, zone_in, zone_out, sos, ignition_on, ignition_off, move_start, stop_duration, offline_duration o custom.

Paginación de eventos #

Sin page, get_events pagina por cursor: la respuesta trae next_cursor y lo envías como cursor en la llamada siguiente, hasta que next_cursor sea null. Con page, la respuesta trae totales. No combines ambos. Una fecha inválida en date_from o date_to no produce error: la API devuelve los datos sin filtrar, así que valida tus fechas antes de enviarlas.

Eventos generados por las alertas (más recientes primero) #

GET /api/get_events Verificado

Lista los eventos generados por las reglas de alerta, del más reciente al más antiguo. Sin page usa paginación por cursor (items.data y items.next_cursor); con page devuelve totales. limit vale 30 por defecto y 1000 como máximo. Las fechas se interpretan en la zona horaria de la cuenta; una fecha inválida no produce error y devuelve los datos sin filtrar. Requiere permiso para ver eventos.

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

Parámetros

Parámetros de /api/get_events
NombreEnTipoObligatorioDescripción
device_idqueryintegerNo
alert_idqueryintegerNo
typequerystringNoTipo de evento (overspeed, zone_in…).
date_fromquerystringNoYYYY-MM-DD HH:MM:SS (zona de la cuenta).
date_toquerystringNo
created_fromquerystringNoSobre created_at.
created_toquerystringNo
searchquerystringNoMensaje o nombre del vehículo.
limitqueryintegerNo
pagequeryintegerNoNúmero de página.
cursorquerystringNonext_cursor de la respuesta anterior (solo sin page).
langquerystringNoIdioma de los textos traducibles (SetLang). También se admite la cabecera Accept-Language.

Ejemplo de solicitud

cURL

cURL
curl -sS -G "https://plataforma.trackerintl.com/api/get_events" \
  -H "user-api-hash: TU_API_HASH" \
  --data-urlencode "limit=50"

JavaScript · Node.js 22

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

const params = new URLSearchParams({
  limit: "50",
});
const respuesta = await fetch(`${BASE_URL}/api/get_events?${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 3 con requests

Python
import json
import requests

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

respuesta = requests.get(
    f"{BASE_URL}/api/get_events",
    headers={"user-api-hash": API_HASH},
    params={"limit": "50"},
    timeout=30,
)
respuesta.raise_for_status()
print(json.dumps(respuesta.json(), indent=2, ensure_ascii=False))

PHP · PHP 8 con cURL

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

$url = $baseUrl . "/api/get_events?" . http_build_query(["limit" => "50"]);
$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

Respuestas de /api/get_events
CódigoDescripción
200Respuesta correcta.
401Hash 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}.
403Sin permiso del rol para el módulo, vehículo de otro usuario o cuenta restringida por facturación. Incluye perm: 0.
500Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico.
Campos de primer nivel de la respuesta 200
Campo (respuesta 200)TipoDescripción
status
itemsPaginator + object | CursorPaginator + objectCon ?page= devuelve Paginator; sin page, CursorPaginator.
Ejemplo de respuesta 200 (datos ficticios)
JSON
{
  "status": 1,
  "items": {
    "data": [
      {
        "id": 5000,
        "user_id": 1,
        "device_id": 9001,
        "geofence_id": null,
        "poi_id": null,
        "position_id": 700,
        "alert_id": 12,
        "type": "overspeed",
        "message": "Exceso de velocidad (ficticio)",
        "address": null,
        "altitude": 0,
        "course": 76,
        "latitude": -17.78,
        "longitude": -63.18,
        "power": null,
        "speed": 41,
        "time": "01-10-2026 17:08:19",
        "deleted": 0,
        "created_at": "2026-10-01 21:08:21",
        "updated_at": "2026-10-01 21:08:21",
        "additional": {
          "overspeed_speed": 30
        },
        "silent": null,
        "name": "Exceso de velocidad",
        "detail": "Velocidad 41 kph, limite 30 kph",
        "geofence": null,
        "device_name": "Camioneta de prueba 01"
      }
    ],
    "path": "https://plataforma.example.invalid/api/get_events",
    "per_page": 30,
    "next_cursor": "eyJldmVudHMuaWQiOjQ5OTl9",
    "next_page_url": "https://plataforma.example.invalid/api/get_events?cursor=eyJldmVudHMuaWQiOjQ5OTl9",
    "prev_cursor": null,
    "prev_page_url": null
  }
}

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.

Reglas de alerta del usuario #

GET /api/get_alerts Verificado

Lista las reglas de alerta del usuario (no los eventos que dispararon). Si el usuario no tiene permiso para ver alertas devuelve items.alerts vacío, con HTTP 200.

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

Parámetros

Parámetros de /api/get_alerts
NombreEnTipoObligatorioDescripción
langquerystringNoIdioma de los textos traducibles (SetLang). También se admite la cabecera Accept-Language.

Ejemplo de solicitud

cURL

cURL
curl -sS "https://plataforma.trackerintl.com/api/get_alerts" \
  -H "user-api-hash: TU_API_HASH"

JavaScript · Node.js 22

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

const respuesta = await fetch(`${BASE_URL}/api/get_alerts`, {
  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 3 con requests

Python
import json
import requests

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

respuesta = requests.get(
    f"{BASE_URL}/api/get_alerts",
    headers={"user-api-hash": API_HASH},
    timeout=30,
)
respuesta.raise_for_status()
print(json.dumps(respuesta.json(), indent=2, ensure_ascii=False))

PHP · PHP 8 con cURL

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

$url = $baseUrl . "/api/get_alerts";
$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

Respuestas de /api/get_alerts
CódigoDescripción
200Respuesta correcta.
401Hash 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}.
403Sin permiso del rol para el módulo, vehículo de otro usuario o cuenta restringida por facturación. Incluye perm: 0.
500Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico.
Campos de primer nivel de la respuesta 200
Campo (respuesta 200)TipoDescripción
status
itemsobject
Ejemplo de respuesta 200 (datos ficticios)
JSON
{
  "status": 1,
  "items": {
    "alerts": [
      {
        "id": 12,
        "user_id": 1,
        "active": 1,
        "name": "Exceso de velocidad (ficticio)",
        "type": "overspeed",
        "for_all_user_devices": 0,
        "schedules": null,
        "notifications": {
          "color": {
            "active": "0"
          },
          "silent": {
            "active": "0",
            "input": "0"
          },
          "sound": {
            "active": "1",
            "input": "alarm1"
          },
          "popup": {
            "active": "1",
            "input": "10"
          },
          "push": {
            "active": "1"
          },
          "email": {
            "active": "0"
          },
          "webhook": {
            "active": "0"
          },
          "sharing_email": {
            "active": "0"
          }
        },
        "created_at": "2026-02-24 21:09:52",
        "updated_at": "2026-02-24 21:09:52",
        "zone": 0,
        "schedule": 0,
        "command": {
          "active": "0",
          "type": "custom"
        },
        "continuous_duration": 0,
        "devices": [
          9001,
          9002
        ],
        "drivers": [],
        "geofences": [],
        "events_custom": [],
        "overspeed": 30
      }
    ]
  }
}

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.

Conteo de eventos por tipo de alerta #

GET /api/get_alerts_summary Verificado

Cuenta los eventos agrupados por tipo. date_from y date_to se comparan sin conversión de zona horaria (UTC) contra la fecha de creación del evento. Solo acepta GET y requiere permiso para ver eventos.

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

Parámetros

Parámetros de /api/get_alerts_summary
NombreEnTipoObligatorioDescripción
date_fromquerystringNocreated_at >= (UTC).
date_toquerystringNocreated_at <= (UTC).
langquerystringNoIdioma de los textos traducibles (SetLang). También se admite la cabecera Accept-Language.

Ejemplo de solicitud

cURL

cURL
curl -sS -G "https://plataforma.trackerintl.com/api/get_alerts_summary" \
  -H "user-api-hash: TU_API_HASH" \
  --data-urlencode "date_from=2026-10-01" \
  --data-urlencode "date_to=2026-10-05"

JavaScript · Node.js 22

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

const params = new URLSearchParams({
  date_from: "2026-10-01",
  date_to: "2026-10-05",
});
const respuesta = await fetch(`${BASE_URL}/api/get_alerts_summary?${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 3 con requests

Python
import json
import requests

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

respuesta = requests.get(
    f"{BASE_URL}/api/get_alerts_summary",
    headers={"user-api-hash": API_HASH},
    params={"date_from": "2026-10-01", "date_to": "2026-10-05"},
    timeout=30,
)
respuesta.raise_for_status()
print(json.dumps(respuesta.json(), indent=2, ensure_ascii=False))

PHP · PHP 8 con cURL

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

$url = $baseUrl . "/api/get_alerts_summary?" . http_build_query(["date_from" => "2026-10-01", "date_to" => "2026-10-05"]);
$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

Respuestas de /api/get_alerts_summary
CódigoDescripción
200Respuesta correcta.
401Hash 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}.
403Sin permiso del rol para el módulo, vehículo de otro usuario o cuenta restringida por facturación. Incluye perm: 0.
500Error interno de la plataforma. Con la depuración apagada el texto del mensaje es genérico.
Campos de primer nivel de la respuesta 200
Campo (respuesta 200)TipoDescripción
status
itemsarray de object
Ejemplo de respuesta 200 (datos ficticios)
JSON
{
  "status": 1,
  "items": [
    {
      "type": "overspeed",
      "title": "Overspeed",
      "count": 18
    },
    {
      "type": "zone_in",
      "title": "Geofence in",
      "count": 4
    }
  ]
}

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.