curl --request GET \
--url https://api.telemax.com.au/v2/api/battery-health \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.telemax.com.au/v2/api/battery-health"
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/battery-health', 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/battery-health",
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/battery-health"
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/battery-health")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telemax.com.au/v2/api/battery-health")
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{
"summary": {
"healthyCount": 18,
"warningCount": 4,
"criticalCount": 1,
"avgScore": 81.30434782608695
},
"items": [
{
"vehicleId": 51207,
"vehicleName": "Delivery Van 07",
"imei": "353148090123456",
"currentVoltage": 12.62,
"isEngineOn": false,
"score": 84,
"band": "Good",
"scoredOn": "2026-10-05",
"daysToReplace": 90,
"badges": [
"HEALTHY"
],
"badgeSummary": "All signals within normal range.",
"restScore": 25,
"crankScore": 20,
"trendScore": 12,
"decayScore": 13,
"chargeScore": 7,
"latestScore": 7,
"last90DaysVoltage": [
{
"date": "2026-10-01",
"voltage": 12.609999656677246
},
{
"date": "2026-10-02",
"voltage": 12.579999923706055
},
{
"date": "2026-10-04",
"voltage": 12.630000114440918
}
]
},
{
"vehicleId": 51318,
"vehicleName": "Service Ute 12",
"imei": null,
"currentVoltage": 12.08,
"isEngineOn": false,
"score": 52,
"band": "Poor",
"scoredOn": "2026-10-05",
"daysToReplace": 31,
"badges": [
"PARK_DRAIN",
"CHARGE_DOWN",
"SHORT_TRIPS"
],
"badgeSummary": "Losing charge while parked; lots of short trips — schedule a load test.",
"restScore": 19,
"crankScore": 13,
"trendScore": 12,
"decayScore": 0,
"chargeScore": 4,
"latestScore": 4,
"last90DaysVoltage": [
{
"date": "2026-10-03",
"voltage": 12.210000038146973
},
{
"date": "2026-10-04",
"voltage": 12.119999885559082
}
]
}
],
"totalCount": 23,
"page": 1,
"pageSize": 2
}Battery health
Paginated battery health scores, badges and daily voltages for the vehicles mapped to your token’s own company.
curl --request GET \
--url https://api.telemax.com.au/v2/api/battery-health \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.telemax.com.au/v2/api/battery-health"
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/battery-health', 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/battery-health",
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/battery-health"
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/battery-health")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telemax.com.au/v2/api/battery-health")
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{
"summary": {
"healthyCount": 18,
"warningCount": 4,
"criticalCount": 1,
"avgScore": 81.30434782608695
},
"items": [
{
"vehicleId": 51207,
"vehicleName": "Delivery Van 07",
"imei": "353148090123456",
"currentVoltage": 12.62,
"isEngineOn": false,
"score": 84,
"band": "Good",
"scoredOn": "2026-10-05",
"daysToReplace": 90,
"badges": [
"HEALTHY"
],
"badgeSummary": "All signals within normal range.",
"restScore": 25,
"crankScore": 20,
"trendScore": 12,
"decayScore": 13,
"chargeScore": 7,
"latestScore": 7,
"last90DaysVoltage": [
{
"date": "2026-10-01",
"voltage": 12.609999656677246
},
{
"date": "2026-10-02",
"voltage": 12.579999923706055
},
{
"date": "2026-10-04",
"voltage": 12.630000114440918
}
]
},
{
"vehicleId": 51318,
"vehicleName": "Service Ute 12",
"imei": null,
"currentVoltage": 12.08,
"isEngineOn": false,
"score": 52,
"band": "Poor",
"scoredOn": "2026-10-05",
"daysToReplace": 31,
"badges": [
"PARK_DRAIN",
"CHARGE_DOWN",
"SHORT_TRIPS"
],
"badgeSummary": "Losing charge while parked; lots of short trips — schedule a load test.",
"restScore": 19,
"crankScore": 13,
"trendScore": 12,
"decayScore": 0,
"chargeScore": 4,
"latestScore": 4,
"last90DaysVoltage": [
{
"date": "2026-10-03",
"voltage": 12.210000038146973
},
{
"date": "2026-10-04",
"voltage": 12.119999885559082
}
]
}
],
"totalCount": 23,
"page": 1,
"pageSize": 2
}Overview
Returns battery health scores for the vehicles mapped to your token’s own company. Vehicles of sub-companies are included only if they are also mapped to it. Only vehicles scored on the company’s latest scoring date are returned: a vehicle that was not scored on that date is left out, and if the company has never been scored the response has no items and zero counts. Each item has the vehicle’s score, band, diagnostic badges and component scores, its daily battery voltages for the last 90 days, and its live voltage and engine state. A fleet summary covers every scored vehicle. Supports filtering, searching, sorting and pagination.Endpoint
GET /v2/api/battery-health
Query parameters
page.% and _ act as wildcards.0 all; 1 Critical; 2 Fair and Poor; 3 Good and Excellent. Any other value returns all.0: internal vehicle ID (sortDescendingis ignored);1: vehicle name;2: score;3: band, alphabetically (Critical, Excellent, Fair, Good, Poor);4:daysToReplace;5:currentVoltage;6:scoredOn. Every item has the same date, so the order is undefined;7: badge severity. Ascending (the default) puts the most severe first:DEEP_DISCHARGE, thenPARK_DRAIN,TREND_DOWN,CHARGE_DOWNandSHORT_TRIPS, thenREPLACEandHEALTHY; ties by score, lowest first.badgeSummaryis""with this sort.
0. Sorting by internal vehicle ID is the only order without ties: with any other sort (for 7, equal severity and score), items with equal values can repeat or be skipped between pages.true, reverses the sort. Ignored for sortBy 0 and for values outside 0–7.0 no filter; 1 DEEP_DISCHARGE; 2 ALTERNATOR (never emitted, so it matches nothing); 3 PARK_DRAIN; 4 TREND_DOWN; 5 CHARGE_DOWN; 6 SHORT_TRIPS; 7 REPLACE; 8 HEALTHY. Any other value returns 500.Response
200 OK —BatteryHealthResponse
Top-level fields
| Field | Type | Description |
|---|---|---|
| summary | object | Fleet-level counts and average score — see below |
| items | array | Paged list of per-vehicle battery health objects — see below |
| totalCount | integer | Number of vehicles matching filter, searchText and badgeFilter, before pagination |
| page | integer | Current page number (1-based) |
| pageSize | integer | Number of items per page |
summary
| Field | Type | Description |
|---|---|---|
| healthyCount | integer | Vehicles with an Excellent or Good band |
| warningCount | integer | Vehicles with a Fair or Poor band |
| criticalCount | integer | Vehicles with a Critical band |
| avgScore | number | Average score of the scored vehicles, not rounded; 0 when there are none |
filter, searchText and badgeFilter.
items[]
Each element in items represents one vehicle.
| Field | Type | Description |
|---|---|---|
| vehicleId | integer | Internal vehicle ID. It can differ from deviceId; match battery rows to position data on imei |
| vehicleName | string | Vehicle display name |
| imei | string | null | Device IMEI for Telemax and Flespi devices; null for other devices |
| currentVoltage | number | null | Battery voltage (V) from the vehicle’s live state; null when unknown |
| isEngineOn | boolean | null | Whether the engine is running, from the vehicle’s live state; null when unknown |
| score | integer | null | Battery health score, 0–100: the sum of the six component scores below |
| band | string | null | "Excellent", "Good", "Fair", "Poor" or "Critical". Excellent is given only to a battery detected as newly replaced |
| scoredOn | string | null | Scoring date (YYYY-MM-DD): the company’s latest scoring date, the same for every item |
| daysToReplace | integer | null | Estimated days until the battery should be replaced, 14–90. A forecast below 14 days is reported as 14 and makes the band Critical, so a value of 14 can come with Poor or Critical; a newly replaced battery starts at 90 |
| badges | string[] | Badge IDs: DEEP_DISCHARGE, PARK_DRAIN, TREND_DOWN, CHARGE_DOWN, SHORT_TRIPS, REPLACE (a new battery; appears on its own), or HEALTHY when no other badge applies. ALTERNATOR exists in badgeFilter but is not currently emitted |
| badgeSummary | string | One sentence summarising the badges, e.g. "All signals within normal range.". Empty ("") when sortBy is 7 |
| restScore | integer | null | Resting-voltage component, 0–30 |
| crankScore | integer | null | Cranking-voltage component, 0–25 |
| trendScore | integer | null | 30-day voltage-trend component, 0–12 |
| decayScore | integer | null | Parked-decay component, 0–13 |
| chargeScore | integer | null | Charge-acceptance component, 0–10 |
| latestScore | integer | null | Latest-reading component, 0–10 |
| last90DaysVoltage | array | Daily battery voltages for the last 90 days: see below |
last90DaysVoltage[]
Daily averages of the external battery voltage over the last 90 days, by UTC date, oldest first. Days without readings are left out, and the array can be empty.
| Field | Type | Description |
|---|---|---|
| date | string | Calendar date (YYYY-MM-DD, UTC) |
| voltage | number | null | Average external battery voltage for that day (V). Returned at single precision and not rounded, so values carry float noise, e.g. 12.609999656677246 |
Example response
{
"summary": {
"healthyCount": 18,
"warningCount": 4,
"criticalCount": 1,
"avgScore": 81.30434782608695
},
"items": [
{
"vehicleId": 51207,
"vehicleName": "Delivery Van 07",
"imei": "353148090123456",
"currentVoltage": 12.62,
"isEngineOn": false,
"score": 84,
"band": "Good",
"scoredOn": "2026-10-05",
"daysToReplace": 90,
"badges": ["HEALTHY"],
"badgeSummary": "All signals within normal range.",
"restScore": 25,
"crankScore": 20,
"trendScore": 12,
"decayScore": 13,
"chargeScore": 7,
"latestScore": 7,
"last90DaysVoltage": [
{ "date": "2026-10-01", "voltage": 12.609999656677246 },
{ "date": "2026-10-02", "voltage": 12.579999923706055 },
{ "date": "2026-10-04", "voltage": 12.630000114440918 }
]
},
{
"vehicleId": 51318,
"vehicleName": "Service Ute 12",
"imei": null,
"currentVoltage": 12.08,
"isEngineOn": false,
"score": 52,
"band": "Poor",
"scoredOn": "2026-10-05",
"daysToReplace": 31,
"badges": ["PARK_DRAIN", "CHARGE_DOWN", "SHORT_TRIPS"],
"badgeSummary": "Losing charge while parked; lots of short trips — schedule a load test.",
"restScore": 19,
"crankScore": 13,
"trendScore": 12,
"decayScore": 0,
"chargeScore": 4,
"latestScore": 4,
"last90DaysVoltage": [
{ "date": "2026-10-03", "voltage": 12.210000038146973 },
{ "date": "2026-10-04", "voltage": 12.119999885559082 }
]
}
],
"totalCount": 23,
"page": 1,
"pageSize": 2
}
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 |
| 422 | A query value cannot be parsed, e.g. filter=abc |
| 500 | badgeFilter outside 0–8, pageNumber below 1, or a negative pageSize (with sortBy 7, invalid paging returns the first page or no items instead). These return 500 only when the company has scored vehicles; otherwise the call returns 200 with no items. They are not transient: fix the parameters rather than retrying. Other 500s are unexpected server errors. |
curl "https://api.telemax.com.au/v2/api/battery-health?pageNumber=1&pageSize=2&filter=0" \
-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.
Query Parameters
Page number, 1 or more. Returned as page in the response. A lower value returns 500 when the company has scored vehicles (with sortBy 7, the first page instead).
Items per page; no maximum. Returned as pageSize in the response. A negative value returns 500 when the company has scored vehicles (with sortBy 7, no items instead).
Case-insensitive substring match on the vehicle name or the device identifier (the IMEI for Telemax and Flespi devices). % and _ act as wildcards.
Band filter: 0 = all, 1 = Critical, 2 = Fair and Poor, 3 = Good and Excellent. Any other value returns all.
Sort field: 0 = internal vehicle ID (sortDescending ignored), 1 = vehicle name, 2 = score, 3 = band (alphabetical), 4 = daysToReplace, 5 = currentVoltage, 6 = scoredOn (all equal, order undefined), 7 = badge severity (ascending puts the most severe first; badgeSummary is empty). Any other value sorts by internal vehicle ID, like 0. All other sorts can tie (7 on equal severity and score), and tied items can repeat or be skipped between pages.
When true, reverses the sort. Ignored for sortBy 0 and for values outside 0–7.
Only vehicles with this badge: 0 = no filter, 1 = DEEP_DISCHARGE, 2 = ALTERNATOR (never emitted), 3 = PARK_DRAIN, 4 = TREND_DOWN, 5 = CHARGE_DOWN, 6 = SHORT_TRIPS, 7 = REPLACE, 8 = HEALTHY. Any other value returns 500 when the company has scored vehicles.
Response
200 OK — A fleet summary and a page of per-vehicle battery health scores, badges, component scores and daily voltages.
Counts and average score over every vehicle scored on the latest date; ignores filter, searchText and badgeFilter.
Show child attributes
Show child attributes
Paginated list of per-vehicle battery health records.
Show child attributes
Show child attributes
Number of vehicles matching filter, searchText and badgeFilter, before pagination.
Current page number (1-based).
Number of results returned per page.
Was this page helpful?