Obtener detalle de posiciones de un activo
curl --request POST \
--url https://api.ugps.io/api/positions/detail \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assetId": "67a1b2c3d4e5f6g7h8i9j0k1",
"from": "01/03/2026 00:00:00",
"to": "10/03/2026 23:59:59"
}
'import requests
url = "https://api.ugps.io/api/positions/detail"
payload = {
"assetId": "67a1b2c3d4e5f6g7h8i9j0k1",
"from": "01/03/2026 00:00:00",
"to": "10/03/2026 23:59:59"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assetId: '67a1b2c3d4e5f6g7h8i9j0k1',
from: '01/03/2026 00:00:00',
to: '10/03/2026 23:59:59'
})
};
fetch('https://api.ugps.io/api/positions/detail', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ugps.io/api/positions/detail",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'assetId' => '67a1b2c3d4e5f6g7h8i9j0k1',
'from' => '01/03/2026 00:00:00',
'to' => '10/03/2026 23:59:59'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ugps.io/api/positions/detail"
payload := strings.NewReader("{\n \"assetId\": \"67a1b2c3d4e5f6g7h8i9j0k1\",\n \"from\": \"01/03/2026 00:00:00\",\n \"to\": \"10/03/2026 23:59:59\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ugps.io/api/positions/detail")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assetId\": \"67a1b2c3d4e5f6g7h8i9j0k1\",\n \"from\": \"01/03/2026 00:00:00\",\n \"to\": \"10/03/2026 23:59:59\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ugps.io/api/positions/detail")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assetId\": \"67a1b2c3d4e5f6g7h8i9j0k1\",\n \"from\": \"01/03/2026 00:00:00\",\n \"to\": \"10/03/2026 23:59:59\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"positions": [
{
"timestamp": 1709251200,
"lat": -33.4489,
"lng": -70.6693,
"speed": 60,
"direction": 180,
"ignition": true,
"satellites": 12
}
],
"flespiId": 1234,
"assetName": "Camión 01"
}
}{
"error": "El email es requerido"
}{
"error": "Token inválido o expirado"
}{
"error": "No tiene permisos para realizar esta acción"
}{
"message": "Error interno del servidor"
}Reportes - Historial de Posiciones
Obtener detalle de posiciones de un activo
Retorna las posiciones GPS individuales de un activo en un rango de fechas. Cada posición incluye coordenadas, velocidad, dirección, estado de ignición y satélites.
El activo debe tener un tracker Flespi asignado (mainTrackerId).
Rango máximo: 30 días.
Formatos de fecha aceptados:
DD/MM/YYYY- Solo fechaDD/MM/YYYY HH:mm- Fecha con hora y minutosDD/MM/YYYY HH:mm:ss- Fecha con hora, minutos y segundos
POST
/
api
/
positions
/
detail
Obtener detalle de posiciones de un activo
curl --request POST \
--url https://api.ugps.io/api/positions/detail \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assetId": "67a1b2c3d4e5f6g7h8i9j0k1",
"from": "01/03/2026 00:00:00",
"to": "10/03/2026 23:59:59"
}
'import requests
url = "https://api.ugps.io/api/positions/detail"
payload = {
"assetId": "67a1b2c3d4e5f6g7h8i9j0k1",
"from": "01/03/2026 00:00:00",
"to": "10/03/2026 23:59:59"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assetId: '67a1b2c3d4e5f6g7h8i9j0k1',
from: '01/03/2026 00:00:00',
to: '10/03/2026 23:59:59'
})
};
fetch('https://api.ugps.io/api/positions/detail', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ugps.io/api/positions/detail",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'assetId' => '67a1b2c3d4e5f6g7h8i9j0k1',
'from' => '01/03/2026 00:00:00',
'to' => '10/03/2026 23:59:59'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ugps.io/api/positions/detail"
payload := strings.NewReader("{\n \"assetId\": \"67a1b2c3d4e5f6g7h8i9j0k1\",\n \"from\": \"01/03/2026 00:00:00\",\n \"to\": \"10/03/2026 23:59:59\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ugps.io/api/positions/detail")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assetId\": \"67a1b2c3d4e5f6g7h8i9j0k1\",\n \"from\": \"01/03/2026 00:00:00\",\n \"to\": \"10/03/2026 23:59:59\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ugps.io/api/positions/detail")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assetId\": \"67a1b2c3d4e5f6g7h8i9j0k1\",\n \"from\": \"01/03/2026 00:00:00\",\n \"to\": \"10/03/2026 23:59:59\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"positions": [
{
"timestamp": 1709251200,
"lat": -33.4489,
"lng": -70.6693,
"speed": 60,
"direction": 180,
"ignition": true,
"satellites": 12
}
],
"flespiId": 1234,
"assetName": "Camión 01"
}
}{
"error": "El email es requerido"
}{
"error": "Token inválido o expirado"
}{
"error": "No tiene permisos para realizar esta acción"
}{
"message": "Error interno del servidor"
}Authorizations
Token de sesión Better Auth o API token (atk_...) en el header Authorization: Bearer <token>. Los JWT legacy ya no son válidos.
Body
application/json
ID del activo (MongoDB ObjectId)
Example:
"67a1b2c3d4e5f6g7h8i9j0k1"
Fecha de inicio del rango. Formatos: DD/MM/YYYY, DD/MM/YYYY HH:mm, DD/MM/YYYY HH:mm:ss
Example:
"01/03/2026 00:00:00"
Fecha de fin del rango. Formatos: DD/MM/YYYY, DD/MM/YYYY HH:mm, DD/MM/YYYY HH:mm:ss
Example:
"10/03/2026 23:59:59"
⌘I