Trip replay (V2)
curl --request GET \
--url https://api.telemax.com.au/v2/api/replay/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.telemax.com.au/v2/api/replay/{id}"
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/replay/{id}', 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/replay/{id}",
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/replay/{id}"
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/replay/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telemax.com.au/v2/api/replay/{id}")
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{
"items": [
{
"distance": 14,
"duration": "00:20:22",
"startAddress": "31, Diamantina Cir, Karalee, Brisbane, Qld, AUS",
"endAddress": "5, Gordon St, Ipswich, Brisbane, Qld, AUS",
"startTimeUser": "05/12/2026 08:09:09",
"endTimeUser": "05/12/2026 08:29:31",
"encoded": "_p~iF~ps|U_ulLnnqC_mqNvxq`@",
"url": "https://maps.googleapis.com/maps/api/staticmap?...",
"points": [
{
"lat": -27.536263,
"lng": 152.840733,
"timeUtc": "2026-05-12T01:09:09",
"speed": 0,
"direction": 260,
"ignition": true,
"timeUser": "2026-05-12T08:09:09",
"odo": 47465,
"fuelLevel": 92,
"fuelVolume": null,
"batteryLevel": null,
"chargerPower": null,
"chargingEnergy": null,
"batteryRange": null
}
]
}
],
"totalResults": 31,
"lastResultIndex": 1,
"currentPage": 1,
"numberOfPages": 31
}Telemetry & replay
Trip replay
Paginated trip replay for a vehicle within a date range.
GET
/
v2
/
api
/
replay
/
{id}
Trip replay (V2)
curl --request GET \
--url https://api.telemax.com.au/v2/api/replay/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.telemax.com.au/v2/api/replay/{id}"
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/replay/{id}', 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/replay/{id}",
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/replay/{id}"
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/replay/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telemax.com.au/v2/api/replay/{id}")
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{
"items": [
{
"distance": 14,
"duration": "00:20:22",
"startAddress": "31, Diamantina Cir, Karalee, Brisbane, Qld, AUS",
"endAddress": "5, Gordon St, Ipswich, Brisbane, Qld, AUS",
"startTimeUser": "05/12/2026 08:09:09",
"endTimeUser": "05/12/2026 08:29:31",
"encoded": "_p~iF~ps|U_ulLnnqC_mqNvxq`@",
"url": "https://maps.googleapis.com/maps/api/staticmap?...",
"points": [
{
"lat": -27.536263,
"lng": 152.840733,
"timeUtc": "2026-05-12T01:09:09",
"speed": 0,
"direction": 260,
"ignition": true,
"timeUser": "2026-05-12T08:09:09",
"odo": 47465,
"fuelLevel": 92,
"fuelVolume": null,
"batteryLevel": null,
"chargerPower": null,
"chargingEnergy": null,
"batteryRange": null
}
]
}
],
"totalResults": 31,
"lastResultIndex": 1,
"currentPage": 1,
"numberOfPages": 31
}Overview
Returns a paginated list of completed trips for the vehicle betweenfrom and to (both UTC), ordered oldest first. A trip in progress appears only once the ignition turns off. Each trip includes route points, addresses, and a Google Polyline encoded path.
This endpoint is equivalent to V1 Trip Replay (UTC) and Trip replay (user time). V2 is paginated.
Rate limit: 4 req/s · 20/min · 600/hr · 14,400/day
Endpoint
GET /v2/api/replay/{id}
Path parameters
integer
required
Public vehicle ID (
deviceId).Query parameters
string (datetime)
Range start (UTC, ISO 8601). Optional — see Which trips are returned.
string (datetime)
Range end (UTC, ISO 8601), inclusive. Optional — see Which trips are returned.
integer
default:"1"
Page number (1-based).
integer
default:"50"
Records per page (max 500).
Which trips are returned
- A trip is included when it overlaps the window: it ends at or after
fromand starts at or beforeto.tois inclusive here, unlike Position history. - Only ignition-on trips whose whole distance is at least 300 m are returned; shorter trips and ignition-off periods are left out.
- Points are clipped to the window. For a trip that crosses the window’s edge,
distance,duration,startTimeUser/endTimeUserandstartAddress/endAddressdescribe only the part inside the window, sodistancecan be under 0.3 km, ornull. - A trip with no points inside the window is skipped but still counted in
totalResults, so a page can hold fewer items thanpageSize. fromandtoare read as UTC. Omitfromto get every trip up toto. Omitting onlytoreturns 422, omitting both returns an empty list, andfromaftertoreturns 422.
Response
200 OK —PagedListResult<TripDto>
| Field | Type | Description |
|---|---|---|
| distance | number | null | Trip distance in km (odometer delta — see note below) |
| duration | string | Trip duration as a .NET TimeSpan string, [d.]hh:mm:ss[.fffffff]: the fraction appears whenever it is non-zero, and the day part for trips of a day or more |
| startAddress | string | Reverse-geocoded start address |
| endAddress | string | Reverse-geocoded end address |
| startTimeUser | string | Time of the trip’s first point inside the window, in the API key’s time zone, formatted MM/dd/yyyy HH:mm:ss (month first, 24-hour) whatever the key’s date format. Not ISO 8601. |
| endTimeUser | string | Time of the trip’s last point inside the window; same format as startTimeUser |
| encoded | string | Google Polyline Algorithm encoded path of the first 400 points inside the window — decode with any standard polyline library |
| url | string | Google Static Maps thumbnail URL drawing encoded (the same 400 points). Requires a valid Google Maps API key configured server-side. |
| points | array | Array of PointDto — see below |
distance is in km, not metres. It is calculated as lastPoint.odometer − startPoint.odometer where odometer is stored in km. A value of 11.34 means 11.34 km.duration is a .NET TimeSpan serialised without a custom converter — "03:05:50", "00:20:22.5000000" when there is a fraction, or "2.04:04:21.0100000" for multi-day trips. It is not ISO 8601.PointDto fields (items in points). All field names are camelCase — no [JsonPropertyName] overrides.
| Field | Type | Description |
|---|---|---|
| lat | number | Latitude |
| lng | number | Longitude |
| timeUtc | datetime | Point timestamp (UTC, no fractional seconds) |
| speed | number | Speed at this point (km/h) |
| direction | number | Compass heading in degrees (N=0, E=90, S=180, W=270) |
| ignition | boolean | Ignition state at this point |
| timeUser | datetime | Point timestamp in the API key’s time zone |
| odo | number | null | Odometer reading at this point (km) |
| fuelLevel | integer | null | Fuel level at this point (%). Connected-car (Compass) vehicles report an electric vehicle’s battery charge here instead of in batteryLevel. |
| fuelVolume | number | null | Fuel volume at this point (litres) |
| batteryLevel | integer | null | Traction battery level at this point (%); electric vehicles and hybrids |
| chargerPower | number | null | Charger power at this point (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 points. |
| batteryRange | number | null | Estimated remaining range at this point (km) |
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 |
| 422 | Invalid date range |
curl "https://api.telemax.com.au/v2/api/replay/88421?from=2026-04-01T00:00:00Z&to=2026-04-02T00:00:00Z&page=1&pageSize=20" \
-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
Query Parameters
Range start (UTC). Optional; omit it to get every trip up to to.
Range end (UTC), inclusive. Omitting only to returns 422; omitting both returns an empty list.
Required range:
x <= 500Response
Successful response
Was this page helpful?