https://developers.gpssoftwarenumberone.com/apiEndpoints disponibles
| Recurso | Endpoint | Descripción |
|---|---|---|
| Dispositivos | /v1/devices | Lista todos los vehículos de tu cuenta |
| Detalle | /v1/devices/:id | Información completa de un dispositivo |
| Ubicación | /v1/devices/:id/location | Última posición GPS conocida |
| Geocercas | /v1/geofences | Lista y consulta geocercas configuradas |
| Eventos | /v1/events | Historial de alertas y eventos de flota |
¿Cómo empezar?
Tu API Key es el mismo user_api_hash que usa la plataforma GPS. No necesitas registro adicional.
curl https://developers.gpssoftwarenumberone.com/api/v1/devices \
-H "Authorization: Bearer TU_API_KEY"
/v1/devices pasando tu API Key como Bearer token.curl https://developers.gpssoftwarenumberone.com/api/v1/devices \
-H "Authorization: Bearer TU_API_KEY"
import requests
API_KEY = "TU_API_KEY"
BASE = "https://developers.gpssoftwarenumberone.com/api"
headers = {"Authorization": f"Bearer {API_KEY}"}
resp = requests.get(f"{BASE}/v1/devices", headers=headers)
devices = resp.json()
print(f"Tienes {devices['count']} dispositivos")
for d in devices['data']:
print(f" {d['id']} — {d['name']} ({d['status']})")
const API_KEY = "TU_API_KEY";
const BASE = "https://developers.gpssoftwarenumberone.com/api";
const resp = await fetch(`${BASE}/v1/devices`, {
headers: { "Authorization": `Bearer ${API_KEY}` }
});
const devices = await resp.json();
console.log(`Tienes ${devices.count} dispositivos`);
devices.data.forEach(d => {
console.log(`${d.id} — ${d.name} (${d.status})`);
});
<?php
$apiKey = "TU_API_KEY";
$base = "https://developers.gpssoftwarenumberone.com/api";
$ch = curl_init("$base/v1/devices");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $apiKey",
"Accept: application/json"
]);
$resp = curl_exec($ch);
$devices = json_decode($resp, true);
echo "Tienes " . $devices['count'] . " dispositivos\n";
foreach ($devices['data'] as $d) {
echo " {$d['id']} — {$d['name']} ({$d['status']})\n";
}
list con el conteo total y el array de dispositivos.{
"object": "list",
"count": 25,
"data": [
{
"id": 200,
"name": "Camion Principal",
"status": "moving",
"protocol": "teltonika",
"lat": 4.710989,
"lng": -74.072092,
"speed": 68,
"course": 45,
"last_seen": "2026-06-02 10:35:00",
"driver": "Juan Perez",
"address": "Calle 80, Bogota",
"sensors": [...]
}
]
}
user_api_hash de tu cuenta en la plataforma GPS.Bearer Token
Incluye el header Authorization en cada request:
Authorization: Bearer <tu_api_key>
Respuestas de error de autenticación
| Código HTTP | error | Causa |
|---|---|---|
| 401 | unauthorized | No se envió el header Authorization |
| 401 | invalid_token | Token incorrecto o cuenta desactivada |
| 503 | gateway_error | No se pudo validar el token temporalmente |
Dónde obtener tu API Key
Inicia sesión en la plataforma GPS → Menú de perfil → User Settings → campo API Hash. Ese valor es tu API Key.
Retorna todos los dispositivos GPS asociados a tu cuenta, incluyendo estado actual, última posición y sensores.
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| object | string | Siempre "list" |
| count | integer | Total de dispositivos |
| data | array | Array de objetos Device |
{
"object": "list",
"count": 3,
"data": [
{
"id": 200,
"name": "Camion Ruta Norte",
"status": "moving",
"protocol": "teltonika",
"lat": 4.710989,
"lng": -74.072092,
"speed": 68,
"course": 45,
"altitude": 2600,
"last_seen": "2026-06-02 10:35:00",
"driver": "Juan Perez",
"address": "Autopista Norte Km 12, Bogota",
"sensors": [
{ "type": "engine_hours", "name": "Horas motor", "value": "1240 h" },
{ "type": "battery", "name": "Bateria", "value": "13.2 V" }
],
"group": "Flota Bogota"
}
]
}
Retorna la información completa de un dispositivo específico.
Parámetros de ruta
| Parámetro | Descripción |
|---|---|
| idrequerido | ID numérico del dispositivo |
{ "error": "not_found", "message": "Dispositivo 999 no encontrado." }
Objeto Device
| Propiedad | Tipo | Descripción |
|---|---|---|
| id | integer | Identificador único del dispositivo |
| name | string | Nombre asignado al vehículo |
| status | string | online · offline · moving |
| protocol | string | Protocolo del GPS (teltonika, gps103, etc.) |
| lat | number | Latitud de última posición |
| lng | number | Longitud de última posición |
| speed | number | Velocidad en km/h |
| course | number | Rumbo en grados (0-360) |
| last_seen | string | Timestamp del último dato recibido |
| driver | string|null | Nombre del conductor asignado |
| sensors | array | Sensores adicionales del dispositivo |
Retorna la última posición GPS registrada del dispositivo, incluyendo coordenadas, velocidad y dirección.
{
"object": "location",
"device_id": 200,
"lat": 4.710989,
"lng": -74.072092,
"speed": 68,
"course": 45,
"altitude": 2600,
"status": "moving",
"address": "Autopista Norte Km 12, Bogota",
"timestamp": 1748870100,
"last_seen": "2026-06-02 10:35:00"
}
Objeto Location
| Propiedad | Tipo | Descripción |
|---|---|---|
| lat | number | Latitud decimal (WGS84) |
| lng | number | Longitud decimal (WGS84) |
| speed | number | Velocidad en km/h |
| course | number | Rumbo 0–360°. 0=Norte, 90=Este |
| altitude | number | Altitud en metros sobre el nivel del mar |
| timestamp | integer | Unix timestamp del dato GPS |
| address | string|null | Dirección aproximada (geocodificación inversa) |
{
"object": "list",
"count": 4,
"data": [
{
"id": 12,
"name": "Bodega Central",
"type": "polygon",
"active": true,
"color": "#FF0000",
"created_at": "2026-01-10 09:00:00"
}
]
}
Parámetros de query
| Parámetro | Descripción |
|---|---|
| device_idopcional | Filtra eventos de un dispositivo específico |
| limitopcional | Máximo de resultados (default: 50, max: 200) |
{
"object": "list",
"count": 12,
"data": [
{
"id": 4501,
"type": "speeding",
"message": "Exceso de velocidad: 95 km/h en zona 60",
"device_id": 200,
"device": "Camion Ruta Norte",
"lat": 4.710989,
"lng": -74.072092,
"timestamp": "2026-06-02 09:12:00"
}
]
}
error es el código de máquina; message es para humanos.Formato de error
{
"error": "not_found",
"message": "Dispositivo 999 no encontrado.",
"docs": "https://developers.gpssoftwarenumberone.com"
}
Códigos HTTP
| Código | error | Cuándo ocurre |
|---|---|---|
| 200 | — | Éxito |
| 401 | unauthorized | Sin header Authorization |
| 401 | invalid_token | Token inválido o expirado |
| 404 | not_found | Recurso no existe o no pertenece a tu cuenta |
| 404 | no_location | Dispositivo sin posición registrada |
| 429 | rate_limit_exceeded | Más de 100 requests por minuto |
| 500 | internal_error | Error interno del servidor |
| 503 | gateway_error | Plataforma GPS no disponible temporalmente |
Rate Limits
La API acepta 100 requests por minuto por IP. Los headers de respuesta indican el estado del límite:
| Header | Descripción |
|---|---|
| RateLimit-Limit | Límite total por ventana (100) |
| RateLimit-Remaining | Requests disponibles en esta ventana |
| RateLimit-Reset | Segundos hasta que se resetea el contador |
demo_gps2024 para probar con datos de muestra sin necesitar una cuenta.
Python — Cliente completo
import requests
from typing import Optional
class GPSClient:
BASE = "https://developers.gpssoftwarenumberone.com/api"
def __init__(self, api_key: str):
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Accept": "application/json"
})
def get_devices(self) -> list:
resp = self.session.get(f"{self.BASE}/v1/devices")
resp.raise_for_status()
return resp.json()["data"]
def get_location(self, device_id: int) -> dict:
resp = self.session.get(f"{self.BASE}/v1/devices/{device_id}/location")
resp.raise_for_status()
return resp.json()
def get_events(self, device_id: Optional[int] = None, limit: int = 50) -> list:
params = {"limit": limit}
if device_id:
params["device_id"] = device_id
resp = self.session.get(f"{self.BASE}/v1/events", params=params)
resp.raise_for_status()
return resp.json()["data"]
# Uso
client = GPSClient("TU_API_KEY")
devices = client.get_devices()
for d in devices:
loc = client.get_location(d["id"])
print(f"{d['name']}: {loc['lat']}, {loc['lng']} — {loc['speed']} km/h")
JavaScript (Node.js) — Cliente completo
class GPSClient {
constructor(apiKey) {
this.baseUrl = "https://developers.gpssoftwarenumberone.com/api";
this.headers = {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json"
};
}
async fetch(path, params = {}) {
const url = new URL(this.baseUrl + path);
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const res = await fetch(url, { headers: this.headers });
if (!res.ok) throw await res.json();
return res.json();
}
getDevices() { return this.fetch("/v1/devices"); }
getDevice(id) { return this.fetch(`/v1/devices/${id}`); }
getLocation(id) { return this.fetch(`/v1/devices/${id}/location`); }
getEvents(params = {}) { return this.fetch("/v1/events", params); }
getGeofences() { return this.fetch("/v1/geofences"); }
}
// Uso
const client = new GPSClient("TU_API_KEY");
const { data: devices } = await client.getDevices();
for (const device of devices) {
try {
const loc = await client.getLocation(device.id);
console.log(`${device.name}: ${loc.lat}, ${loc.lng}`);
} catch (e) {
if (e.error === "no_location") console.log(`${device.name}: sin posición`);
}
}
v1.0.0 — Junio 2026
Lanzamiento inicial de la API pública GPS Tracking.
- Endpoint
GET /v1/devices— lista de dispositivos - Endpoint
GET /v1/devices/:id— detalle de dispositivo - Endpoint
GET /v1/devices/:id/location— última posición - Endpoint
GET /v1/geofences— lista de geocercas - Endpoint
GET /v1/events— historial de eventos - Autenticación Bearer token
- Rate limiting 100 req/min
- Sandbox interactivo
Selecciona un recurso en el menú lateral para ver su documentación detallada.
platform_hash directo. Si la key se compromete, la revogas y generas una nueva sin cambiar nada en la plataforma GPS.Generar una API Key
Crea una nueva API Key vinculada a tu cuenta. Requiere tu platform_hash (el user_api_hash de tu cuenta en la plataforma GPS). La key generada solo se muestra una vez.
Body (JSON)
| Campo | Tipo | Req. | Descripcion |
|---|---|---|---|
platform_hash | string | REQ | Tu user_api_hash de la plataforma GPS |
label | string | OPT | Nombre descriptivo (ej. "Integracion Fleetio") |
expires_in_days | integer | OPT | Dias de vigencia. Default: 365. Max: 3650. |
curl -X POST "https://developers.gpssoftwarenumberone.com/api/v1/keys" \
-H "Content-Type: application/json" \
-d '{"platform_hash":"TU_USER_API_HASH","label":"Mi integracion","expires_in_days":365}'
Respuesta
{
"object": "api_key",
"id": "550e8400-e29b-41d4-a716-446655440000",
"key": "gps_live_a1b2c3d4e5f6...",
"label": "Mi integracion",
"created_at": 1748822400000,
"expires_at": 1780358400000,
"platform_email": "usuario@empresa.com",
"message": "Guarda esta clave — no se volvera a mostrar completa."
}
Listar tus API Keys
Retorna todas las keys de tu cuenta. Autenticacion con tu platform_hash en el header Authorization: Bearer. Los valores de las keys se muestran truncados.
curl "https://developers.gpssoftwarenumberone.com/api/v1/keys" \
-H "Authorization: Bearer TU_PLATFORM_HASH"
Revocar una API Key
Revoca una key de forma inmediata e irreversible. Cualquier integracion que la use dejara de funcionar al instante.
curl -X DELETE "https://developers.gpssoftwarenumberone.com/api/v1/keys/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer TU_PLATFORM_HASH"
Formato de las keys
Todas las keys generadas tienen el prefijo gps_live_ seguido de 48 caracteres hexadecimales aleatorios:
gps_live_a1b2c3d4e5f6789012345678901234567890123456789012Generar una key ahora
Descargar
Importar en Postman
- Descarga el archivo
gps-tracking-api-openapi.yaml - Abre Postman → Import → arrastra el archivo
- Configura la variable
api_keycon tuuser_api_hash - Usa
demo_gps2024para probar sin cuenta real
Importar en Swagger UI
Pega la URL de la especificacion en editor.swagger.io:
https://developers.gpssoftwarenumberone.com/openapi.yaml
Contenido de la coleccion
- GET /health — Estado del servicio (sin auth)
- GET /v1/devices — Listar todos los dispositivos
- GET /v1/devices/:id — Detalle de un dispositivo
- GET /v1/devices/:id/location — Ultima posicion GPS
- GET /v1/geofences — Listar geocercas
- GET /v1/events — Historial de eventos con filtros
api_key = demo_gps2024 preconfigurada para probar de inmediato.Base URL
https://developers.gpssoftwarenumberone.com/apiMetodos HTTP
| Metodo | Uso |
|---|---|
GET | Consultar recursos (no modifica datos) |
POST | Crear recursos (en endpoints futuros) |
PUT | Actualizar un recurso completo |
DELETE | Eliminar un recurso |
Formato de respuesta
Todas las respuestas son Content-Type: application/json. Las listas incluyen object, count y data. Los errores incluyen error (codigo), message (descripcion) y docs (enlace a documentacion).
{ "object": "list", "count": 3, "data": [...] }{ "error": "not_found", "message": "Dispositivo 999 no encontrado.", "docs": "https://developers.gpssoftwarenumberone.com" }Headers de respuesta
| Header | Descripcion |
|---|---|
RateLimit-Limit | Limite maximo de requests por ventana |
RateLimit-Remaining | Requests disponibles en la ventana actual |
RateLimit-Reset | Segundos hasta que se reinicia el contador |
Cuando se supera el limite
El servidor responde con HTTP 429 Too Many Requests:
{ "error": "rate_limit_exceeded", "message": "Demasiadas solicitudes. Maximo 100 por minuto." }Buenas practicas
- Implementa exponential backoff cuando recibas un 429.
- Usa caching local para datos que no cambian frecuentemente (geocercas, lista de dispositivos).
- Prefiere polling de posiciones a intervalos de 30+ segundos.