API REST para acceder a rankings de rutas y datos de atletas de Vestigio
https://vestigio.app
La API de Vestigio ofrece acceso programático a rankings de rutas, datos de intentos e información de atletas. Todos los endpoints devuelven respuestas JSON y siguen convenciones REST.
Por ahora los endpoints de la API son de acceso público. Versiones futuras podrían requerir claves de API o autenticación OAuth.
/api/ranking
Devuelve el ranking completo de una ruta específica, con el detalle de todos los intentos y la información del atleta.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id |
string | Sí | El GUID de la ruta (no el ID numérico) |
GET /api/ranking?id=abc123-def456-ghi789
Devuelve un objeto JSON con la información de la ruta y un arreglo de entradas del ranking.
{
"route": {
"id": 1,
"name": "Cerro San Cristóbal",
"description": "Ruta desde Plaza Italia hasta la cumbre",
"meters": 3500,
"minutes": 45,
"city": "Santiago",
"country": "Chile",
"guid": "abc123-def456-ghi789"
},
"ranking": [
{
"trialId": 123,
"seconds": 1845,
"timeFormatted": "00:30:45",
"startMillis": 1704067200000,
"endMillis": 1704069045000,
"daysOld": 5,
"valid": true,
"suspicious": false,
"discipline": "Running",
"user": {
"id": 45,
"guid": "user-guid-123",
"email": "athlete@example.com",
"publicName": "John Doe",
"alias": "SpeedRunner",
"gender": 1,
"age": 28,
"city": "Santiago",
"country": "Chile",
"instagram": "@speedrunner"
},
"startLocation": {
"id": 10,
"name": "Plaza Italia",
"latLong": "-33.4378,-70.6504",
"city": "Santiago",
"country": "Chile"
},
"endLocation": {
"id": 11,
"name": "Cerro San Cristóbal",
"latLong": "-33.4245,-70.6389",
"city": "Santiago",
"country": "Chile"
}
}
]
}
Falta un parámetro obligatorio
{
"error": "Missing routeId parameter"
}
Ruta no encontrada
{
"error": "Route not found for id=abc123-def456-ghi789"
}
route (object) - Información de la rutaranking (array) - Arreglo de entradas de intento/ranking, ordenadas por tiempo (el más rápido primero)id (number) - ID numérico de la rutaname (string) - Nombre de la rutadescription (string) - Descripción de la rutameters (number) - Distancia de la ruta en metrosminutes (number) - Tiempo estimado en minutoscity (string) - Ciudad donde está la rutacountry (string) - País donde está la rutaguid (string) - Identificador único de la ruta (úsalo en las llamadas a la API)trialId (number) - ID del intentoseconds (number) - Tiempo transcurrido en segundostimeFormatted (string) - Tiempo formateado (HH:MM:SS)startMillis (number) - Marca de tiempo de inicio en milisegundosendMillis (number) - Marca de tiempo de fin en milisegundosdaysOld (number) - Días desde que se completó el intentovalid (boolean) - Si el intento es válidosuspicious (boolean) - Si el intento está marcado como sospechosodiscipline (string|null) - Nombre de la disciplina (p. ej., "Running", "Cycling")user (object|null) - Información del atleta/usuariostartLocation (object|null) - Detalles del punto de inicioendLocation (object|null) - Detalles del punto de metaid (number) - ID numérico del usuarioguid (string) - Identificador único del usuarioemail (string) - Correo electrónico del usuariopublicName (string) - Nombre público (alias o prefijo del email)alias (string|null) - Alias/nombre de usuariogender (number) - Género (0 = mujer, 1 = hombre)age (number) - Edad del usuariocity (string|null) - Ciudad del usuariocountry (string|null) - País del usuarioinstagram (string|null) - Usuario de Instagramid (number) - ID numérico de la ubicaciónname (string) - Nombre de la ubicaciónlatLong (string) - Coordenadas en formato "lat,lng"city (string|null) - Ciudadcountry (string|null) - Paísguid de la ruta (no el id numérico) en las llamadas a la API/api/trials
Devuelve los últimos 1000 intentos de un usuario/atleta específico, con el detalle de cada intento y la información de la ruta.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id |
string | Sí | El GUID del usuario/atleta |
GET /api/trials?id=user-guid-123-456-789
Devuelve un objeto JSON con la información del usuario y un arreglo de sus intentos.
{
"user": {
"id": 45,
"guid": "user-guid-123-456-789",
"email": "athlete@example.com",
"publicName": "John Doe",
"alias": "SpeedRunner",
"gender": 1,
"age": 28,
"city": "Santiago",
"country": "Chile",
"instagram": "@speedrunner"
},
"trials": [
{
"trialId": 123,
"seconds": 1845,
"timeFormatted": "00:30:45",
"startMillis": 1704067200000,
"endMillis": 1704069045000,
"daysOld": 5,
"valid": true,
"suspicious": false,
"discipline": "Running",
"comments": "Great run today!",
"route": {
"id": 1,
"guid": "route-guid-abc-123",
"name": "Cerro San Cristóbal",
"description": "Ruta desde Plaza Italia hasta la cumbre",
"meters": 3500,
"minutes": 45,
"city": "Santiago",
"country": "Chile"
},
"startLocation": {
"id": 10,
"name": "Plaza Italia",
"latLong": "-33.4378,-70.6504",
"city": "Santiago",
"country": "Chile"
},
"endLocation": {
"id": 11,
"name": "Cerro San Cristóbal",
"latLong": "-33.4245,-70.6389",
"city": "Santiago",
"country": "Chile"
}
}
]
}
Falta un parámetro obligatorio
{
"error": "Missing user id parameter"
}
Usuario no encontrado
{
"error": "User not found for id=user-guid-123-456-789"
}
user (object) - Información del usuario/atletatrials (array) - Arreglo de entradas de intento, ordenadas de más reciente a más antiguoid (number) - ID numérico del usuarioguid (string) - Identificador único del usuarioemail (string) - Correo electrónico del usuariopublicName (string) - Nombre público (alias o prefijo del email)alias (string|null) - Alias/nombre de usuariogender (number) - Género (0 = mujer, 1 = hombre)age (number) - Edad del usuariocity (string|null) - Ciudad del usuariocountry (string|null) - País del usuarioinstagram (string|null) - Usuario de InstagramtrialId (number) - ID del intentoseconds (number) - Tiempo transcurrido en segundostimeFormatted (string) - Tiempo formateado (HH:MM:SS)startMillis (number) - Marca de tiempo de inicio en milisegundosendMillis (number) - Marca de tiempo de fin en milisegundosdaysOld (number) - Días desde que se completó el intentovalid (boolean) - Si el intento es válidosuspicious (boolean) - Si el intento está marcado como sospechosodiscipline (string|null) - Nombre de la disciplina (p. ej., "Running", "Cycling")comments (string|null) - Comentarios del usuario sobre el intentoroute (object|null) - Información de la rutastartLocation (object|null) - Detalles del punto de inicioendLocation (object|null) - Detalles del punto de metaid (number) - ID numérico de la rutaguid (string) - Identificador único de la rutaname (string) - Nombre de la rutadescription (string) - Descripción de la rutameters (number) - Distancia de la ruta en metrosminutes (number) - Tiempo estimado en minutoscity (string|null) - Ciudad donde está la rutacountry (string|null) - País donde está la rutaid (number) - ID numérico de la ubicaciónname (string) - Nombre de la ubicaciónlatLong (string) - Coordenadas en formato "lat,lng"city (string|null) - Ciudadcountry (string|null) - Paísguid del usuario (no el id numérico) en las llamadas a la API/api/routeStats
Devuelve estadísticas completas de una ruta específica, incluyendo análisis de tiempos, percentiles, desglose por género y más.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id |
string | Sí | El GUID de la ruta (no el ID numérico) |
GET /api/routeStats?id=abc123-def456-ghi789
Devuelve un objeto JSON con la información de la ruta y estadísticas completas.
{
"route": {
"id": 1,
"guid": "abc123-def456-ghi789",
"name": "Cerro San Cristóbal",
"description": "Ruta desde Plaza Italia hasta la cumbre",
"meters": 3500,
"city": "Santiago",
"country": "Chile"
},
"statistics": {
"totalTrials": 150,
"uniqueAthletes": 85,
"times": {
"best": {
"seconds": 1245,
"formatted": "00:20:45"
},
"worst": {
"seconds": 5400,
"formatted": "01:30:00"
},
"mean": {
"seconds": 2100,
"formatted": "00:35:00"
},
"median": {
"seconds": 1980,
"formatted": "00:33:00"
},
"standardDeviation": 650.5
},
"percentiles": {
"p10": {
"seconds": 1350,
"formatted": "00:22:30"
},
"p25": {
"seconds": 1620,
"formatted": "00:27:00"
},
"p50": {
"seconds": 1980,
"formatted": "00:33:00"
},
"p75": {
"seconds": 2520,
"formatted": "00:42:00"
},
"p90": {
"seconds": 3240,
"formatted": "00:54:00"
}
},
"gender": {
"male": {
"count": 100,
"uniqueAthletes": 60,
"best": 1245,
"mean": 2000,
"median": 1900
},
"female": {
"count": 50,
"uniqueAthletes": 25,
"best": 1380,
"mean": 2300,
"median": 2200
}
},
"dateRange": {
"firstTrial": "2023-01-15T10:30:00Z",
"lastTrial": "2024-01-10T14:45:00Z"
}
}
}
Cuando la ruta existe pero no tiene intentos finalizados
{
"route": {
"id": 1,
"guid": "abc123-def456-ghi789",
"name": "Cerro San Cristóbal"
},
"message": "No finished trials for this route",
"stats": null
}
Falta un parámetro obligatorio
{
"error": "Missing route id parameter"
}
Ruta no encontrada
{
"error": "Route not found for id=abc123-def456-ghi789"
}
route (object) - Información de la rutastatistics (object) - Estadísticas completas de la rutaid (number) - ID numérico de la rutaguid (string) - Identificador único de la rutaname (string) - Nombre de la rutadescription (string) - Descripción de la rutameters (number) - Distancia de la ruta en metroscity (string|null) - Ciudad donde está la rutacountry (string|null) - País donde está la rutatotalTrials (number) - Número total de intentos completadosuniqueAthletes (number) - Número de atletas únicostimes (object) - Estadísticas de tiempo (mejor, peor, media, mediana, desv. estándar)percentiles (object) - Desglose de percentiles (p10, p25, p50, p75, p90)gender (object) - Estadísticas agrupadas por génerodateRange (object) - Fechas del primer y último intentobest (object) - Mejor (más rápido) tiempo, con segundos y cadena formateadaworst (object) - Peor (más lento) tiempomean (object) - Tiempo promediomedian (object) - Tiempo mediano (percentil 50)standardDeviation (number) - Desviación estándar en segundosp10 (object) - Percentil 10 (corte del 10% más rápido)p25 (object) - Percentil 25 (corte del 25% más rápido)p50 (object) - Percentil 50 (mediana)p75 (object) - Percentil 75p90 (object) - Percentil 90Contiene las claves: male, female, other (si hay datos)
count (number) - Número de intentos de este génerouniqueAthletes (number) - Atletas únicos de este génerobest (number) - Mejor tiempo en segundosmean (number) - Tiempo promedio en segundosmedian (number) - Tiempo mediano en segundosfirstTrial (string|null) - Fecha ISO 8601 del primer intentolastTrial (string|null) - Fecha ISO 8601 del intento más recienteguid de la ruta (no el id numérico) en las llamadas a la APIPara preguntas, problemas o solicitudes de funciones relacionadas con la API, por favor contáctanos.