Last position (V2)
curl --request GET \
--url https://api.telemax.com.au/v2/api/vehicles/{id}/last-position \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.telemax.com.au/v2/api/vehicles/{id}/last-position"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.telemax.com.au/v2/api/vehicles/{id}/last-position', 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.telemax.com.au/v2/api/vehicles/{id}/last-position",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.telemax.com.au/v2/api/vehicles/{id}/last-position"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.telemax.com.au/v2/api/vehicles/{id}/last-position")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telemax.com.au/v2/api/vehicles/{id}/last-position")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"utcTime": "2026-04-29T06:14:08",
"userTime": "2026-04-29T16:14:08",
"userTimeFormatted": "29/04/2026 04:14:08 PM",
"lat": -33.8761,
"lng": 151.2049,
"speed": 46,
"course": 188,
"ignition": true,
"odometer": 45327.9,
"voltage": 14.1,
"fatigue": "00:00:00",
"engineHours": 0,
"satelliteCoverage": "Good",
"satelliteCoverageRawValue": 9,
"networkCoverage": "Good",
"networkCoverageRawValue": 22,
"deviceId": 88421,
"ignitionTime": 14.3829,
"deviceName": "Delivery Van 07",
"imei": "353148090123456",
"vin": "1HGBH41JXMN109186",
"startMovingTime": "2026-04-29T06:01:10",
"startMovingTimeUser": "2026-04-29T16:01:10",
"lastMovementTime": "2026-04-29T06:11:37",
"lastMovementTimeUser": "2026-04-29T16:11:37",
"lastMovementTimeUserFormatted": "29/04/2026 04:11:37 PM",
"drivingTime": 778,
"fuelLevel": 63,
"fuelVolume": 50.4,
"batteryLevel": null,
"chargerPower": null,
"chargingEnergy": null,
"batteryRange": null,
"isDoorLocked": true,
"address": "14, George St, Haymarket, Sydney, NSW, AUS",
"engineEnabled": true,
"timeElapsed": 312.47,
"startedTime": "2026-04-29T06:14:22",
"endTime": "2026-04-29T06:14:22",
"isOnline": false
}Vehicles
Last position
Returns the last known position for a single vehicle.
GET
/
v2
/
api
/
vehicles
/
{id}
/
last-position
Last position (V2)
curl --request GET \
--url https://api.telemax.com.au/v2/api/vehicles/{id}/last-position \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.telemax.com.au/v2/api/vehicles/{id}/last-position"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.telemax.com.au/v2/api/vehicles/{id}/last-position', 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.telemax.com.au/v2/api/vehicles/{id}/last-position",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.telemax.com.au/v2/api/vehicles/{id}/last-position"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.telemax.com.au/v2/api/vehicles/{id}/last-position")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telemax.com.au/v2/api/vehicles/{id}/last-position")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"utcTime": "2026-04-29T06:14:08",
"userTime": "2026-04-29T16:14:08",
"userTimeFormatted": "29/04/2026 04:14:08 PM",
"lat": -33.8761,
"lng": 151.2049,
"speed": 46,
"course": 188,
"ignition": true,
"odometer": 45327.9,
"voltage": 14.1,
"fatigue": "00:00:00",
"engineHours": 0,
"satelliteCoverage": "Good",
"satelliteCoverageRawValue": 9,
"networkCoverage": "Good",
"networkCoverageRawValue": 22,
"deviceId": 88421,
"ignitionTime": 14.3829,
"deviceName": "Delivery Van 07",
"imei": "353148090123456",
"vin": "1HGBH41JXMN109186",
"startMovingTime": "2026-04-29T06:01:10",
"startMovingTimeUser": "2026-04-29T16:01:10",
"lastMovementTime": "2026-04-29T06:11:37",
"lastMovementTimeUser": "2026-04-29T16:11:37",
"lastMovementTimeUserFormatted": "29/04/2026 04:11:37 PM",
"drivingTime": 778,
"fuelLevel": 63,
"fuelVolume": 50.4,
"batteryLevel": null,
"chargerPower": null,
"chargingEnergy": null,
"batteryRange": null,
"isDoorLocked": true,
"address": "14, George St, Haymarket, Sydney, NSW, AUS",
"engineEnabled": true,
"timeElapsed": 312.47,
"startedTime": "2026-04-29T06:14:22",
"endTime": "2026-04-29T06:14:22",
"isOnline": false
}Overview
Returns the most recent position record for the specified vehicle.The V1 version of this endpoint is Vehicle Position.
Rate limit: 144,000 req/s · 144,000/min · 144,000/hr · 60/day — in practice 60 requests per day per API key
Endpoint
GET /v2/api/vehicles/{id}/last-position
Path parameters
integer
required
Public vehicle ID (
deviceId).Response
200 OK —PositionDto, or an empty HTTP 200 with no body.
The body is empty when the vehicle has no stored position, or has not yet completed an ignition-on or ignition-off period (for example a tracker with no ignition input). Fleet last positions, List vehicles and Nearest vehicles may still show such a vehicle. Check for an empty response before parsing; it is not JSON
null.PositionDto on every endpoint that returns it. List vehicles, Fleet last positions and Nearest vehicles build it from the server’s cached vehicle state rather than from the latest stored record, so a few fields mean something different there. Those rows say so under “list, fleet, nearest”; “this endpoint” means Last position.
Record & timestamps
| Field | Type | Description |
|---|---|---|
| utcTime | datetime | UTC, no fractional seconds. This endpoint: the time of the vehicle’s latest record. lat, lng, speed and course are the last known fix, which can be older than the record when the record carried no position. List, fleet, nearest: the time the server last rebuilt the vehicle’s state, not the time of the position — it can be much later. For the latest record time, call this endpoint. |
| userTime | datetime | utcTime in the API key’s time zone |
| userTimeFormatted | string | utcTime in the API key’s time zone, formatted as the key’s date format followed by hh:mm:ss tt (12-hour clock, e.g. 28/04/2026 04:14:19 PM) |
| Field | Type | Description |
|---|---|---|
| lat | number | Latitude. List, fleet, nearest: 0 for a vehicle with no stored position (never reported, or nothing left in its stored history); such a vehicle also has an extremely large fatigue. |
| lng | number | Longitude; 0 in the same case as lat |
| speed | number | Speed (km/h) |
| course | integer | Compass direction in degrees (N=0, E=90, S=180, W=270) |
| Field | Type | Description |
|---|---|---|
| ignition | boolean | Ignition state |
| odometer | number | null | Odometer (km), from the vehicle’s configured source (CAN or GPS) when the device reports it, otherwise from the device’s own source |
| voltage | number | null | Vehicle (12/24 V) battery voltage (V). Not the tracker’s internal battery. |
| fatigue | string | .NET TimeSpan, [d.]hh:mm:ss[.fffffff]. This endpoint: always "00:00:00". List, fleet, nearest: time since the ignition last changed state — the current trip if the engine is on, the current stop if it is off. For a vehicle that has never completed an ignition change (for example a tracker with no ignition input) it counts from an arbitrary server-side start instead. Not a rest or fatigue measure. |
| engineHours | number | Always 0; not populated |
| Field | Type | Description |
|---|---|---|
| satelliteCoverage | string | Label for satelliteCoverageRawValue: null → Wifi-Cell, 0 → No GPS Signal, 1–5 → Low, 6–7 → Fair, 8–11 → Good, 12 or more → Excellent. Describes the record’s own satellite data, not the age of the fix. This endpoint: a record without satellite data gives Wifi-Cell. List, fleet, nearest: the count can carry over from earlier records. |
| satelliteCoverageRawValue | integer | null | Number of satellites |
| networkCoverage | string | Label for networkCoverageRawValue: 25 or more → Excellent, 19–24 → Good, 11–18 → Fair, 4–10 → Low, 1–3 → Very Low, 0 or less → No Network, null → No network information. Can carry over on list, fleet and nearest, as above. |
| networkCoverageRawValue | integer | null | Raw cellular signal value |
| Field | Type | Description |
|---|---|---|
| deviceId | integer | Public vehicle ID: the ID used as {id} in every /v2/api/vehicles/{id} route. -1 when the vehicle has no public ID (seen only on fleet and nearest). |
| ignitionTime | number | Seconds; never null. Engine on: request time − utcTime, so on list, fleet and nearest it counts from the server’s last rebuild, not from the record. Engine off: the duration of the previous ignition-on period (0 if none), including short ones that Trip replay leaves out. |
| deviceName | string | Vehicle display name |
| imei | string | null | Tracker IMEI. null for connected-car vehicles without a Telemax or Flespi tracker. |
| vin | string | null | Vehicle Identification Number |
| Field | Type | Description |
|---|---|---|
| startMovingTime | datetime | null | The first point above 3 km/h among the route-record points the calling endpoint reads (UTC). See the note below. |
| startMovingTimeUser | datetime | null | startMovingTime in the API key’s time zone |
| lastMovementTime | datetime | null | The last point at or below 3 km/h among the same points (UTC) |
| lastMovementTimeUser | datetime | null | lastMovementTime in the API key’s time zone |
| lastMovementTimeUserFormatted | string | null | lastMovementTime formatted like userTimeFormatted |
| Field | Type | Description |
|---|---|---|
| drivingTime | integer | null | utcTime − startMovingTime, in whole seconds; null when startMovingTime is null |
Which points the movement fields read. A route record is one ignition-on or ignition-off period. This endpoint reads the current and the previous route record; list, fleet and nearest read only the last completed one. The values depend on whether the device keeps reporting while parked, so treat them as indicative, not as trip boundaries. For completed trips use Trip replay; the trip in progress is only reflected on this endpoint.
| Field | Type | Description |
|---|---|---|
| fuelLevel | integer | null | Fuel level (%). Connected-car (Compass) vehicles report an electric vehicle’s battery charge here instead of in batteryLevel. List, fleet, nearest: null for fully electric vehicles, so that charge is not shown there. |
| fuelVolume | number | null | Fuel volume (litres); null in the same case as fuelLevel |
null when the vehicle does not report them. Hybrids can report them too. Connected-car (Compass) vehicles never fill batteryLevel; their battery charge is in fuelLevel.
| Field | Type | Description |
|---|---|---|
| batteryLevel | integer | null | Traction battery level (%) |
| chargerPower | number | null | Charger power (kW) |
| chargingEnergy | number | null | Energy delivered in the current charging session (kWh). It resets when a new session starts, so do not sum it across records. |
| batteryRange | number | null | Estimated remaining range (km) |
| Field | Type | Description |
|---|---|---|
| address | string | Reverse-geocoded address: house number, street, suburb, city, state and country code (alpha-3), comma-separated, with no postcode — for example "14, George St, Haymarket, Sydney, NSW, AUS". Parts with no value are left out, so the number of parts varies. The address is that of a nearby address point (a property’s address in the map data): the house number can be a range or carry a letter (244-246, 533A), it can belong to a neighbouring property, and the street can be a nearby street rather than the road the vehicle is on. When no address point is near, the address is the road’s, with no house number. "--" when the position has not been geocoded. |
| engineEnabled | boolean | This endpoint: false only when the engine is immobilised. List, fleet, nearest: always true. |
| isDoorLocked | boolean | null | Door state, from a different signal depending on the vehicle’s connection, and the response does not say which applies. Connected-car (Compass) vehicles: false when any door reports unlocked, otherwise true — including when the vehicle sends no lock data, so true does not confirm a lock; never null once the vehicle has reported. Flespi-connected vehicles: true when the doors are closed, which does not mean locked; null when the vehicle reports no door status. Other vehicles (Telemax trackers): always null. |
| Field | Type | Description |
|---|---|---|
| isOnline | boolean | Always present. This endpoint (known issue): always false; use Last online for accurate online status. List, fleet, nearest: true when the vehicle’s latest heartbeat — or its latest data, when no heartbeat is known — is within the last 5 minutes. Connected-car vehicles send no heartbeats, so for them it means data within the last 5 minutes. |
| Field | Type | Description |
|---|---|---|
| timeElapsed | number | Server processing time (milliseconds). Not meant for clients. |
| startedTime | datetime | Server processing start (UTC) |
| endTime | datetime | Server processing end (UTC on the hosted API) |
Error responses
| Status | Meaning |
|---|---|
| 401 | Missing, invalid or expired bearer token (INVALID_CREDENTIALS) |
| 403 | The API key lacks this endpoint’s permission (INVALID_SCOPE), or the company is suspended (CompanySuspended) — see 403 Forbidden |
| 404 | Vehicle not found, or not in your companies |
curl "https://api.telemax.com.au/v2/api/vehicles/88421/last-position" \
-H "Authorization: Bearer <token>"
Authorizations
JWT Bearer token obtained from POST /v2/api/authentication/token/api-key.
Lifetime: ~24 hours (86,399 seconds). Cache the token and reuse it. Re-authenticate 5 minutes before expiry.
Scoping: API key tokens are scoped by the key's company and its action set; see Token scoping.
No refresh endpoint — re-authenticate with your API key when the token expires.
Path Parameters
Response
Successful response
Was this page helpful?