Deprecation policy
When an endpoint or field is deprecated:- A deprecation notice is added to this changelog and to the relevant endpoint reference page.
- The live API begins returning a
SunsetHTTP response header (RFC 8594) on every call to the deprecated route, with the removal date as an HTTP-date value: - The endpoint continues to work for a minimum of 6 months from the deprecation notice date.
- After the Sunset date the route may return
410 Goneor be removed entirely.
If you receive a
Sunset header in an API response, plan your migration before the date shown. Contact Telemax support if you need an extension.API versioning
V2 responses include anX-API-Version response header containing the major API version number:
401 for a missing, invalid or expired bearer token, or on a 429 (see Response headers).
URL paths encode the version directly (/v2/api/... vs /api/...). The X-API-Version header provides a redundant signal for integration monitoring.
Version history
2026-10-07 — Documentation corrections
No API change: the API already behaved as described below. These corrections bring the documentation in line with production. If you built an integration from the earlier text, check the items that affect it.Corrected
Companies & fleetGET /v2/api/companies/{id}/alert-records—addressleads with a house number whenever a nearby address point is found, not only on point-of-interest matches, e.g."14, George St, Haymarket, Sydney, NSW, AUS"; the house number can be a range or carry a letter (244-246,533A); the whole address is that address point’s, so it can be a neighbouring property’s, even one on a nearby street rather than the road the vehicle was on; otherwise it is the road’s address, with no house number; parts with no value are left out
- Position fields (vehicle list, last position, fleet last positions, nearest) —
addresslikewise (see PositionDto fields) GET /v2/api/vehicles/{id}/engine-codes—location.addresslikewise
2026-10-06 — Documentation corrections
No API change: the API already behaved as described below. These corrections bring the documentation in line with production. If you built an integration from the earlier text, check the items that affect it.Corrected
Authentication- Token scoping — a token can use its own company and its direct, non-cancelled sub-companies; companies further down are listed by
GET /v2/api/companiesbut return404on other endpoints, and so do vehicles mapped only to them, with the exceptions described in Token scoping
GET /v2/api/companies— your own company is the item withlevel0, listed last (on the last page when there are more companies thanpageSize), not the first itemGET /v2/api/companies/{id}/vehicles/last-position— returns only the vehicles mapped to{id}, not every vehicle of its sub-companies; to cover your fleet, call it for your own company and each direct sub-company, and de-duplicate bydeviceId(orimeiwhendeviceIdis-1);checkVehicleHandlerStateis optional and has no dependable effect, so leave itfalseGET /v2/api/companies/{id}/vehicles/nearest— distances are planar degrees, not metres, with no road routing:realDistanceis in degrees, anddistanceisrealDistancerounded to a multiple of 100, so it is0for any nearby point;radiusis compared with that roundeddistance, so from a nearby point aradiusof 1 or more keeps every vehicle with a position and aradiusof 0 or less returns none; results are not ordered by nearness, andnumkeeps the first N results, not the N nearest, with no default cap; to find the nearest vehicles, compute distances yourself fromvehicle.latandvehicle.lngGET /v2/api/companies/{id}/alert-records— returns records for every company your token can read;{id}must be one of them but does not narrow the scope; only 10 alert types are returned;numapplies per alert type and is required in practice (without it the list is empty), so set it to at leastpage×pageSizefor the deepest page you readGET /v2/api/companies/{id}/alerts—alertTypeis the display name, e.g.Low Battery, not a numeric string;unitsandtagsare the lists saved on the alert, not the monitored set: whenisAllFleetistruethe alert covers every vehicle of its company, whateverunitslists; paused definitions are returned, and no field marks themPUT /v2/api/companies/{id}/set-all-alerts-read— takes no date range (startDateandendDateare ignored) and marks every record of the 10 alert-record types across your token’s companies;{id}must be one of them but does not narrow the scope; the read flag is shared with the Telemax Dashboard, so Dashboard users see the records as read too
- Vehicle IDs — a vehicle’s public and internal IDs can differ. The public ID is the
{id}of every/v2/api/vehicles/{id}route and of/v2/api/replay/{id},deviceIdin position data, andvehicleIdin device-ids, fleet last-time-online and alert configurations’units[];vehicleIdin alert records and battery health, andVehicleIdin webhook payloads, are internal IDs (see Vehicle ID) - Position fields (vehicle list, last position, positions, fleet last positions, nearest) — on vehicle list, fleet last positions and nearest,
utcTimeis when the server last rebuilt the vehicle’s state, not the time of the position;fatigueis not the time since the last rest: it is always00:00:00on last position, and on vehicle list, fleet last positions and nearest the time since the ignition last changed state;ignitionTimeis not cumulative;engineHoursis always0;voltage, andinternalBatteryVoltageon positions, are the vehicle (12/24 V) battery, not the tracker’s;odometercomes from the vehicle’s configured source, CAN or GPS, when the device reports it, and otherwise from the device’s own source;isDoorLockedis documented again;truedoes not confirm a lock, because on connected-car (Compass) vehicles it is alsotruewhen the vehicle sends no lock data and on Flespi-connected vehicles it means the doors are closed; for Telemax trackers it is alwaysnull;timeElapsedis in milliseconds;engineEnabledandsatelliteCoverageare now described per endpoint; the electric-vehicle fieldsbatteryLevel,chargerPower,chargingEnergyandbatteryRangeare now documented (see PositionDto fields) GET /v2/api/vehicles/{id}/last-position— the empty200body is also returned when the vehicle has not yet completed an ignition-on or ignition-off periodGET /v2/api/vehicles/{id}/positions—tois exclusiveGET /v2/api/vehicles/info— also returns404when the vehicle has no VIN, and[]when its VIN has not been decodedGET /v2/api/vehicles/{id}/odometer—odometerValueis read live from Flespi, so it is alwaysnullfor vehicles not on the Flespi data provider, and it can differ fromodometerin position dataGET /v2/api/vehicles/{id}/engine-codes— returns the codes newly reported in the latest engine-fault record, not the codes currently active;descriptionisnullwhen no AI analysis exists;detectedAtis in the API key’s time zone
PUT /v2/api/vehicles/{id}/odometer—odometerdefaults to0, so omitting it sets the odometer to0; a200does not confirm that the device received or applied the value;409may be returned when the odometer comes from the CAN bus
PUT /v2/api/alerts/{id}/{date}/update-read-status— an omittedisReadmarks the record unread; when no record matches, the response is200with no change, not404;{date}is the record’sutcTimeand must match the stored trigger time exactly, to the fraction of a second, so a record stored with fractional seconds cannot be addressed and the call returns200with no change
GET /v2/api/replay/{id}— only completed ignition-on trips of at least 300 m that overlap the window are returned, andtois inclusive here;encodedandurlcover only the first 400 points of a trip;startTimeUserandendTimeUserare formattedMM/dd/yyyy HH:mm:sswhatever the key’s date format; omittingfromreturns every trip up toto, omitting onlytoreturns422, and points are clipped to the window
GET /v2/api/battery-health— now documents the response production returns:score,band,badges,badgeSummary, the component scores andlast90DaysVoltage(oldest first), notvoltageHistory,forecast,statusesorhealthScore;bandisExcellent,Good,Fair,PoororCritical, notCritical,WarningorHealthy. It covers only the vehicles mapped to your token’s own company and scored on its latest scoring date; the values offilter,sortByandbadgeFilterare listed, and with any sort other than internal vehicle ID, items with equal values can repeat or be skipped between pages
POST /v2/api/webhooks— an alert ID that is unknown, deleted or not in your companies returns404, not422;httpURLs are accepted; a host that does not resolve, or resolves to a loopback, private or similar address, is refused. Thesecretis 64 uppercase hexadecimal characters, and its case matters because the signing key is that exact stringGET /v2/api/webhooks/{id}— also returns webhooks of direct, non-cancelled sub-companiesGET /v2/api/webhooks— lists every webhook that is not deleted, active or not, of your token’s companies (its own and its direct, non-cancelled sub-companies)PUT /v2/api/webhooks/{id}— as the body replaces the whole configuration, omittingisActivere-enables a disabled webhook,isGlobaldefaults tofalse, and switching a webhook to global removes its links; also accepts webhooks of direct, non-cancelled sub-companiesDELETE /v2/api/webhooks/{id}— deliveries stop within about 30 seconds, and deliveries already queued, including retries, still go out; also accepts webhooks of direct, non-cancelled sub-companiesPOST /v2/api/webhooks/{id}/link-alert— also accepts webhooks and alert configurations of direct, non-cancelled sub-companies; a global webhook cannot have links, and the call returns422
- Alert monitoring, Vehicle diagnostics and Trip replay guides — sample code corrected: alert polling passes
numand does not treat a record’sidas unique (it is the alert configuration’s ID), alert type names match the API, battery health is paged withpageNumberand matched to vehicles byimei, and maps draw frompointsbecauseencodedholds at most 400 - Glossary — create V2 keys under Settings → API Keys V2; keys from Webhooks & Api Keys are V1 keys, which the V2 token endpoint rejects
- Quirks — units and formats corrected, e.g.
fatigueis a .NETTimeSpanstring, not ISO 8601, and tripdistanceis in km - Request and response — a field with no value is written as
null, never omitted; the webhookPOSTandPUTroutes take a JSON body - Introduction, Quickstart, Which endpoint and Environments — V2 has no location-update command; battery health returns scores, not predictions; the Quickstart examples use the camelCase keys the API returns (
deviceId,lat,utcTime);POST /v2/api/vehicles/listtakes up to 50 known vehicle IDs and is not a search; Environments links the V2 OpenAPI specification
- The API versioning section and the 2026-04-28 API V2 release entry — the section no longer says that every V2 response carries
X-API-Version; that entry no longer lists endpoints that V2 does not have, its rate-limit andX-API-Versionlines are corrected, andGET /v2/api/vehicles/{id}/odometerandPUT /v2/api/vehicles/{id}/odometer/sourcehave their own 2026-06-01 entry
2026-10-05 — Documentation corrections
No API change: the API already behaved as described below. These corrections bring the documentation in line with production. If you built an integration from the earlier text, check the items that affect it.Corrected
Infrastructure (V2 only)- Rate limiting — limits apply per API key, not per token, and per endpoint, in four fixed windows (second, minute, hour and day), not sliding ones; the per-endpoint limits are corrected, and four single-vehicle endpoints have one tight limit, counted per API key across all vehicles:
GET /v2/api/vehicles/{id}/last-position60 per day,GET /v2/api/vehicles/{id}/positions60 per hour,GET /v2/api/vehicles/info60 per minute andGET /v2/api/vehicles/{id}/last-online2 per second; every response that reaches an endpoint counts, including403,404,409,422and500;Retry-Afteris the length of the exhausted window (1,60,3600or86400seconds), so wait that long rather than capping a backoff at 60 seconds; the token endpoint is not rate-limited; theX-RateLimit-*headers are live, not “not yet active” as the specification said (see Rate limiting) - Errors — a resource that exists but is outside your token’s companies returns
404, not403;403means the API key lacks the endpoint’s permission (INVALID_SCOPE) or the company is suspended, which has its own body (CompanySuspended); every model-binding failure returns the same422description; everydocUrlnow leads to a reference page; the error table on each endpoint page is corrected (see Errors) - Pagination —
lastResultIndexis the 1-based position of the last record on the page, not a zero-based index;pageSizeis at most100on alert records and alert configurations; battery health takespageNumberandpageSize(see Pagination) X-API-Version— always2, not date-based; not sent on a401for a missing, invalid or expired bearer token, or on a429(see Response headers)
POST /v2/api/authentication/token/api-key— the examples use a 43-character API key instead of a GUID, and showexpires_inas an integer (86399)
POST /v2/api/vehicles/list— vehicle IDs that are unknown or not in your companies are left out of the200response, without an error
- Webhook payloads — keys are delivered in PascalCase, e.g.
AlertType,VehicleIdandPosition.Lat, not in camelCase (alertType,vehicleId) as previously shown; match key names exactly.Address, when notnull, always has 9 keys, includingPostalCode(notpostcode);AlertTypevalues includeExceedMaximumSpeedandLowBattery, notSpeeding, and on global webhooks some values contain spaces and differ from the namesGET …/alertsreturns, e.g.Speed Limitfor Above Speed Limit andDoor Unlockedfor Doors Unlocked;VehicleIdis the internal vehicle ID./webhooks.yamlnow describes the payload that is actually sent (see Payload shape) - Webhook delivery — deliveries start only once Telemax has enabled webhook alerts for the company that owns the linked alert configuration (for a global webhook, the company that owns the webhook); each event gets up to 3 attempts with a 5-second timeout, 2 then 5 seconds apart, not exponential backoff, and is dropped after the third failure; a
300,301,302or303redirect is re-sent as aGETwithout the body, so register the final URL;X-Telemax-Deliverychanges on every attempt, so it cannot identify a retry, and an event can occasionally arrive again as a new delivery: de-duplicate on a hash of the raw body; verify the signature with the secret exactly as returned, as UTF-8 text, not hex-decoded; global webhooks receive only the types listed under Supported alert types, and Charging, Exceed RPM, Exceed Engine Temperature and Driving after dark are not delivered (see Delivery retries)
Removed from the documentation
Not on V2POST /v2/api/authentication/token/user,POST /v2/api/vehicles/{id}/ignition,PUT /v2/api/vehicles/{id}/door-lock,GET /v2/api/safety-score/{id}andGET /v2/api/vehicles/{id}/dtc— documented, but not part of V2; they return404(PATH_NOT_FOUND). Ignition, door lock and safety score are V1 only; for engine codes useGET /v2/api/vehicles/{id}/engine-codes
2026-06-01 — Odometer endpoints
Added
VehiclesGET /v2/api/vehicles/{id}/odometer— new — the vehicle’s odometer source and reading
PUT /v2/api/vehicles/{id}/odometer/source— new — set the odometer source to CAN or GPS
2026-04-28 — API V2 release
Added
Infrastructure (V2 only)- Rate limiting per API key and per endpoint; a request over a limit returns
429with aRetry-Afterheader — see Rate limiting for the windows and headers - Exception middleware — all V2 errors return a standardised
ApiErrorJSON body (type,code,description,requestId,docUrl) X-API-Version: 2response header on V2 responses (not on a401for a missing, invalid or expired token, or on a429)
POST /v2/api/authentication/token/api-key— V2 API key login
GET /v2/api/companies— paginated list of accessible companiesGET /v2/api/companies/{id}/vehicles/last-position— paginated fleet-wide last positionsGET /v2/api/companies/{id}/vehicles/nearest— nearest vehicles to a coordinate (paginated)GET /v2/api/companies/{id}/vehicles/last-time-online— paginated fleet last-seen timestampsGET /v2/api/companies/{id}/alert-records— paginated alert recordsGET /v2/api/companies/{id}/alerts— new — paginated alert configurations with stringAlertTypeand linked vehicle/tag listsPUT /v2/api/companies/{id}/set-all-alerts-read— mark every alert record of the 10 types in Alert records as read across your token’s companies;{id}must be one of those companies but does not narrow the scope
POST /v2/api/vehicles/list— paginated vehicle listGET /v2/api/vehicles/{id}/last-position— last known position for a vehicleGET /v2/api/vehicles/{id}/positions— paginated position historyGET /v2/api/vehicles/info— new — look up vehicle metadata by IMEI, vehicle ID, or VINGET /v2/api/vehicles/{id}/last-online— last-seen timestamp for a vehicleGET /v2/api/vehicles/{imei}/device-ids— IMEI → vehicle ID lookupGET /v2/api/vehicles/{id}/engine-codes— changed — paginated engine codes newly reported in the latest engine-fault record (V1 returns every code in the latest DTC report), with AI analysis where available, severity, and detection location
PUT /v2/api/vehicles/{id}/odometer— update odometerPUT /v2/api/vehicles/{id}/name— rename vehicle
PUT /v2/api/alerts/{id}/{date}/update-read-status— new — mark a single alert record as read or unread
GET /v2/api/replay/{id}— paginated trip replay
GET /v2/api/battery-health— paginated battery health scores
POST /v2/api/webhooks— create a webhook; response includes the plaintext HMAC secret (returned once only)GET /v2/api/webhooks/{id}— get a webhook by IDGET /v2/api/webhooks— paginated list of the webhooks of your token’s companiesPUT /v2/api/webhooks/{id}— replace a webhook’s configuration (URL, active state, global flag and linked alerts)DELETE /v2/api/webhooks/{id}— soft-delete a webhookPOST /v2/api/webhooks/{id}/link-alert— link an alert configuration to a webhook
X-Telemax-Signature: sha256=<hex> and X-Telemax-Delivery: <uuid>.
2026-04-28 — GetSafetyScore parameter updates
Changed
Insights & diagnosticsPOST /api/GetSafetyScore—vehicleIdparameter renamed fromid(breaking for clients using the old name)POST /api/GetSafetyScore—startandfinishare now optional; omit both and supplyintervalTypeto use a preset time windowPOST /api/GetSafetyScore— newintervalTypeparameter:1= instant range,2= relative to end of local day,3= three-day window,4= week window. Validate preset windows in staging before relying on them (see endpoint reference for the known date-arithmetic quirk)
2026-04-14 — v1 (Initial public documentation)
Added
AuthenticationPOST /api/Authentication/token/user— JWT via username + passwordPOST /api/Authentication/token/api-key— JWT via API key
POST /api/GetCompanies— list accessible companiesPOST /api/GetAllLastPositionData/{companyId}— fleet-wide last positionsPOST /api/GetNearestVehicles— nearest vehicles to a coordinatePOST /api/devices— vehicle list for a companyPOST /api/GetAllLastTimeOnline— last-seen timestamps for all vehicles
POST /api/GetLastPositionData— latest position for one vehiclePOST /api/GetPositionData— historical positions for one vehiclePOST /api/GetReplay— trip replay (UTC time context)POST /api/GetReplayUserTime— trip replay (user timezone context)GET /api/GetDeviceId— IMEI → vehicle ID lookup
POST /api/GetAlerts— list alerts for a companyPOST /api/SetAlertAsRead— mark one alert as readPOST /api/SetAllAlertAsRead— mark all company alerts as read
POST /api/GetCompanyVehiclesBatteryHealth— paged battery predictionsPOST /api/GetSafetyScore— trip safety score for a vehicleGET /api/devices/{id}/dtc-codes— latest DTC codes from vehicle handler state
POST /api/ChangeOdometer— update odometer valuePOST /api/SetVehicleName— rename a vehiclePOST /api/UpdateLocation— trigger device location updatePOST /api/SendIgnition— send ignition enable/disable commandPOST /api/LastTimeOnline— last-seen timestamp for one vehiclePOST /api/SendDoorLock— send door lock command (ATrack SMS path)
POST /api/Test— anonymous connectivity health check
Deprecated
POST /api/rebuild-vehicle-movement-cache— removed from public API reference (internal dev/ops only; not for integration partners).
This changelog follows Keep a Changelog format. Future entries will appear at the top of the Version history section, newest first.