Skip to main content

Devices

Manage the GPS tracking units in your fleet — list, inspect, get real-time position, or update configuration.

Prerequisites

All endpoints require a valid JWT token, API key, and tenant header. See Authentication.


List Devices​

Retrieve a paginated list of devices with filtering support.

GET/apidev/v1/fleet/devices
PermissionAPICLI_FLEET_DEVICES_READ
Rate Limit30 req/min (sliding window)
Cache60s

Query Parameters​

ParameterTypeRequiredDefaultDescription
limitintegerNo25Records per page. Min: 1, Max: 100
offsetintegerNo0Records to skip
statusstringNo—A (active) or I (inactive)
namestringNo—Partial match on device name or alias. Max length 80
imeistringNo—Partial match on IMEI (primary or secondary). Max length 50
license_platestringNo—Partial match on license plate. Max length 30
device_groupstringNo—Partial match on device group name. Max length 80

Response Fields​

FieldTypeDescription
idstringDevice unique identifier (BigInt as string)
namestring | nullDevice display name
aliasstring | nullShort alias
license_platestring | nullVehicle license plate
imei_appstring | nullPrimary IMEI number
imei_gpsstring | nullSecondary IMEI number
external_idstring | nullIdentifier in an external system
activebooleanWhether the device is currently active
statusstring"A" (active) or "I" (inactive)
device_groupstring | nullGroup or category name
last_positionobject | nullLast known GPS position (see Position fields)

Code Example​

curl -s "https://$TENANT/apidev/v1/fleet/devices?limit=10&status=A" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Example Response​

{
"success": true,
"data": [
{
"id": "104820579301",
"name": "Movil 10",
"alias": "M10",
"license_plate": "ABC123",
"imei_app": "352093081234567",
"imei_gps": "352093089876543",
"external_id": null,
"active": true,
"status": "A",
"device_group": "Trucks",
"last_position": {
"latitude": "-34.9011",
"longitude": "-56.1645",
"speed": "45.2",
"heading": 180,
"datetime": "2026-04-04T14:32:00",
"last_signal_at": "2026-04-04T14:32:00",
"ignition_on_at": "2026-04-04T07:15:00",
"ignition_off_at": null,
"address": "Av. 18 de Julio 1234, Montevideo",
"odometer": "84523.7",
"horometer": "3210.5"
}
},
{
"id": "104820579315",
"name": "Movil 15",
"alias": null,
"license_plate": "XYZ789",
"imei_app": "352093089876543",
"imei_gps": null,
"external_id": "EXT-0015",
"active": true,
"status": "A",
"device_group": "Vans",
"last_position": null
}
],
"meta": {
"total": 42,
"limit": 10,
"offset": 0
}
}
info

last_position is null when the device has never reported GPS data. The list endpoint does not include satellites, battery_voltage, or external_power — use the Position endpoint for full telemetry.


Device Detail​

Full profile for a single device including vehicle metadata, assigned driver, and last known position with extended telemetry.

GET/apidev/v1/fleet/devices/{id}
PermissionAPICLI_FLEET_DEVICES_READ
Rate Limit30 req/min (sliding window)
Cache30s

Path Parameters​

ParameterTypeRequiredDescription
idstringYesDevice unique identifier

Response Fields​

All fields from List Devices, plus:

FieldTypeDescription
image_urlstring | nullURL to the device/vehicle image
brandstring | nullVehicle brand (e.g., Toyota, Ford)
modelstring | nullVehicle model
yearinteger | nullVehicle model year
notesstring | nullFree-text notes
driverobject | nullAssigned driver: { id, name }
last_positionobject | nullExtended position with satellites, battery_voltage, external_power (see Position fields)

Code Example​

curl -s "https://$TENANT/apidev/v1/fleet/devices/104820579301" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Example Response​

{
"success": true,
"data": {
"id": "104820579301",
"name": "Movil 10",
"alias": "M10",
"license_plate": "ABC123",
"imei_app": "352093081234567",
"imei_gps": "352093089876543",
"external_id": "EXT-0042",
"active": true,
"status": "A",
"device_group": "Trucks",
"image_url": null,
"brand": "Toyota",
"model": "Hilux",
"year": 2022,
"notes": "Assigned to the northern delivery route",
"driver": {
"id": "104820579455",
"name": "Carlos Martinez"
},
"last_position": {
"latitude": "-34.9011",
"longitude": "-56.1645",
"speed": "45.2",
"heading": 180,
"datetime": "2026-04-04T14:32:00",
"last_signal_at": "2026-04-04T14:32:00",
"ignition_on_at": "2026-04-04T07:15:00",
"ignition_off_at": null,
"address": "Av. 18 de Julio 1234, Montevideo",
"odometer": "84523.7",
"horometer": "3210.5",
"satellites": "12",
"battery_voltage": "12.6",
"external_power": 1
}
},
"meta": {}
}

Device Position​

Last known GPS position with full telemetry — coordinates, speed, ignition, sensors, and signal data.

GET/apidev/v1/fleet/devices/{id}/position
PermissionAPICLI_FLEET_DEVICES_READ
Rate Limit30 req/min (sliding window)
Cache30s

Path Parameters​

ParameterTypeRequiredDescription
idstringYesDevice unique identifier

Response Fields​

FieldTypeDescription
device_idstringDevice identifier
device_namestring | nullDevice display name
latitudestring | nullLatitude coordinate
longitudestring | nullLongitude coordinate
speedstring | nullSpeed in km/h
headinginteger | nullHeading in degrees (0–360). Travels as a JSON number, not as text.
datetimestring | nullTimestamp of the position report
last_signal_atstring | nullTimestamp of last signal received
ignition_on_atstring | nullTimestamp when ignition was last turned on
ignition_off_atstring | nullTimestamp when ignition was last turned off
addressstring | nullReverse geocoded address
odometerstring | nullOdometer reading (km)
horometerstring | nullHour meter reading (hours)
satellitesstring | nullGPS satellites in view
battery_voltagestring | nullInternal battery reading, exactly as the tracking unit reports it. Some models send a voltage ("12.6"); others send a charge-level label in Spanish ("Batería media", "Sin alimentación (shutdown)"). Always treat it as text — do not assume it parses as a number.
external_powerstring | nullExternal power status
Flat structure

Unlike Device Detail which nests GPS data under last_position, this endpoint returns position fields at the root level alongside device_id and device_name.

Code Example​

curl -s "https://$TENANT/apidev/v1/fleet/devices/104820579301/position" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Example Response​

{
"success": true,
"data": {
"device_id": "104820579301",
"device_name": "Movil 10",
"latitude": "-34.9011",
"longitude": "-56.1645",
"speed": "62.5",
"heading": 270,
"datetime": "2026-04-04T14:45:12",
"last_signal_at": "2026-04-04T14:45:12",
"ignition_on_at": "2026-04-04T07:15:00",
"ignition_off_at": null,
"address": "Ruta 1 km 23, San Jose",
"odometer": "84523.7",
"horometer": "3210.5",
"satellites": "12",
"battery_voltage": "12.6",
"external_power": 1
},
"meta": {}
}

Position Fields​

Reference for the position/telemetry fields used across Device Detail (last_position object) and Device Position (root level):

FieldTypeIn ListIn DetailIn PositionDescription
latitudestring | null✓✓✓Latitude coordinate
longitudestring | null✓✓✓Longitude coordinate
speedstring | null✓✓✓Speed in km/h
headinginteger | null✓✓✓Heading 0–360°, as a JSON number
datetimestring | null✓✓✓Position timestamp
last_signal_atstring | null✓✓✓Last signal timestamp
ignition_on_atstring | null✓✓✓Ignition on timestamp
ignition_off_atstring | null✓✓✓Ignition off timestamp
addressstring | null✓✓✓Reverse geocoded address
odometerstring | null✓✓✓Odometer (km)
horometerstring | null✓✓✓Hour meter (hours)
satellitesstring | null—✓✓GPS satellites
battery_voltagestring | null—✓✓Internal battery reading: voltage or charge-level label depending on the tracking unit (always text)
external_powerstring | null—✓✓External power
device_idstring——✓Device ID (position only)
device_namestring | null——✓Device name (position only)
Timestamps

All timestamps are returned without timezone (e.g., "2026-04-04T14:32:00"). The value represents the company's configured timezone. Do not append Z or apply UTC conversion — display as-is.


Update Device​

Update a device's configuration. Only send the fields you want to change — omitted fields keep their current value. Send null to clear a nullable field; name, status, and imei cannot be null (you get 400 VALIDATION_ERROR). An unknown {id} returns 404 NOT_FOUND even with an empty body.

PUT/apidev/v1/fleet/devices/{id}
PermissionAPICLI_FLEET_DEVICES_WRITE
Rate Limit30 req/min (sliding window)
CacheNone

Path Parameters​

ParameterTypeRequiredDescription
idstringYesDevice unique identifier

Request Body​

All fields are optional — only include those you want to modify. See Partial Updates for the general pattern.

FieldTypeMax LengthDescription
namestring40Device display name
aliasstring15Short alias
statusstring10Device status (e.g., "A", "I")
license_platestring20Vehicle license plate
brandstring40Vehicle brand
modelstring60Vehicle model
yearinteger—Vehicle model year
max_speednumber—Maximum speed limit (km/h)
tank_capacitynumber—Fuel tank capacity in liters
device_type_idstring40Device type identifier
provider_idstring40Provider identifier
country_idstring40Country identifier
department_idstring40Department identifier
gmt_offsetnumber—GMT timezone offset
imeistring40Primary IMEI number
imei2string50Secondary IMEI number
external_idstring100External system identifier
phonestring50SIM card phone number
image_urlstring500URL to the device/vehicle image
notesstring2000Free-text notes
temp_lownumber—Low temperature alarm threshold
temp_highnumber—High temperature alarm threshold
temp_sensor_1boolean—Enable temperature sensor 1
temp_sensor_2boolean—Enable temperature sensor 2
cut_oilboolean—Fuel cut feature enabled
virtual_odometerboolean—Virtual odometer enabled

Code Example​

curl -s -X PUT "https://$TENANT/apidev/v1/fleet/devices/104820579301" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '{
"license_plate": "ABC999",
"max_speed": 120,
"notes": "Updated route assignment"
}'

Example Response​

{
"success": true,
"data": {
"id": "104820579301",
"updated_fields": ["license_plate", "max_speed", "notes"]
},
"meta": {}
}

Errors​

All endpoints on this page may return these errors. See Error Handling for the full reference.

CodeHTTPApplies toDescription
VALIDATION_ERROR400List, UpdateInvalid query params or body fields (e.g., limit > 100, max_speed negative)
UNAUTHORIZED401AllMissing, invalid, or expired tenant / Authorization / X-API-Key
FORBIDDEN403AllUser lacks APICLI_FLEET_DEVICES_READ or APICLI_FLEET_DEVICES_WRITE
NOT_FOUND404Detail, Position, UpdateDevice ID doesn't exist or doesn't belong to your tenant
RATE_LIMITED429AllExceeded 30 req/min