curl --request PATCH \
--url https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sos": {
"inputBit": 1
},
"ignition": {
"inputBit": 1
},
"temperature": {
"source": "<string>"
}
}
'import requests
url = "https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors"
payload = {
"sos": { "inputBit": 1 },
"ignition": { "inputBit": 1 },
"temperature": { "source": "<string>" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({sos: {inputBit: 1}, ignition: {inputBit: 1}, temperature: {source: '<string>'}})
};
fetch('https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors', 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/trackers/flespi/{flespiId}/sensors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'sos' => [
'inputBit' => 1
],
'ignition' => [
'inputBit' => 1
],
'temperature' => [
'source' => '<string>'
]
]),
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/trackers/flespi/{flespiId}/sensors"
payload := strings.NewReader("{\n \"sos\": {\n \"inputBit\": 1\n },\n \"ignition\": {\n \"inputBit\": 1\n },\n \"temperature\": {\n \"source\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sos\": {\n \"inputBit\": 1\n },\n \"ignition\": {\n \"inputBit\": 1\n },\n \"temperature\": {\n \"source\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sos\": {\n \"inputBit\": 1\n },\n \"ignition\": {\n \"inputBit\": 1\n },\n \"temperature\": {\n \"source\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"imei": "<string>",
"flespiId": "<string>",
"name": "<string>",
"clientId": "<string>",
"phone": "<string>",
"hardware": "<string>",
"lastPosition": {
"latitude": 123,
"longitude": 123,
"altitude": 123
},
"lastConnection": "2023-11-07T05:31:56Z",
"speed": 123,
"ignitionStatus": true,
"timestamp": "2023-11-07T05:31:56Z",
"trip_config": "no_config",
"initial_odometer": 0,
"odometer_calculated": false,
"initial_horometer": 0,
"horometer_calculated": false
}
}{
"error": "El email es requerido"
}{
"error": "Token inválido o expirado"
}{
"error": "No tiene permisos para realizar esta acción"
}{
"error": "Recurso no encontrado"
}{
"status": "failed",
"code": "TRACKER_SENSOR_DIN_CONFLICT",
"message": "Esa entrada digital ya está asignada a otro sensor del dispositivo"
}{
"message": "Error interno del servidor"
}Configurar sensores de un tracker por Flespi ID
Actualiza la configuración de sensores de un tracker (PATCH parcial). Solo persiste los sensores presentes en el body; el mapping sensor→DIN es metadata Atlas y no se replica al dispositivo en Flespi.
Permisos requeridos: access_fleet_assets
Semántica por sensor:
- objeto (
{ inputBit }/{ source }) → asigna el sensor null→ desasigna el sensor (unset)- omitido → no se toca
Nota: debe enviarse al menos un sensor a actualizar.
Colisión de DIN: sos e ignition no pueden compartir inputBit. Se valida la
configuración resultante (persistida + PATCH); la colisión responde 409
TRACKER_SENSOR_DIN_CONFLICT.
curl --request PATCH \
--url https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sos": {
"inputBit": 1
},
"ignition": {
"inputBit": 1
},
"temperature": {
"source": "<string>"
}
}
'import requests
url = "https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors"
payload = {
"sos": { "inputBit": 1 },
"ignition": { "inputBit": 1 },
"temperature": { "source": "<string>" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({sos: {inputBit: 1}, ignition: {inputBit: 1}, temperature: {source: '<string>'}})
};
fetch('https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors', 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/trackers/flespi/{flespiId}/sensors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'sos' => [
'inputBit' => 1
],
'ignition' => [
'inputBit' => 1
],
'temperature' => [
'source' => '<string>'
]
]),
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/trackers/flespi/{flespiId}/sensors"
payload := strings.NewReader("{\n \"sos\": {\n \"inputBit\": 1\n },\n \"ignition\": {\n \"inputBit\": 1\n },\n \"temperature\": {\n \"source\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sos\": {\n \"inputBit\": 1\n },\n \"ignition\": {\n \"inputBit\": 1\n },\n \"temperature\": {\n \"source\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ugps.io/api/trackers/flespi/{flespiId}/sensors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sos\": {\n \"inputBit\": 1\n },\n \"ignition\": {\n \"inputBit\": 1\n },\n \"temperature\": {\n \"source\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"imei": "<string>",
"flespiId": "<string>",
"name": "<string>",
"clientId": "<string>",
"phone": "<string>",
"hardware": "<string>",
"lastPosition": {
"latitude": 123,
"longitude": 123,
"altitude": 123
},
"lastConnection": "2023-11-07T05:31:56Z",
"speed": 123,
"ignitionStatus": true,
"timestamp": "2023-11-07T05:31:56Z",
"trip_config": "no_config",
"initial_odometer": 0,
"odometer_calculated": false,
"initial_horometer": 0,
"horometer_calculated": false
}
}{
"error": "El email es requerido"
}{
"error": "Token inválido o expirado"
}{
"error": "No tiene permisos para realizar esta acción"
}{
"error": "Recurso no encontrado"
}{
"status": "failed",
"code": "TRACKER_SENSOR_DIN_CONFLICT",
"message": "Esa entrada digital ya está asignada a otro sensor del dispositivo"
}{
"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.
Path Parameters
ID del dispositivo en Flespi
Body
Sensor SOS. null para desasignar
Show child attributes
Show child attributes
Sensor de ignición por DIN. null para desasignar. Configurado, interval
lee din.N como señal de ignición en vez de engine.ignition.status
(viajes por ignición, alertas de ignición, horas motor).
Show child attributes
Show child attributes
Sensor de temperatura. null para desasignar
Show child attributes
Show child attributes