Skip to main content

Content types

UsageContent-Type
Token endpointsapplication/x-www-form-urlencoded
POST /api/v2/vehicles/listapplication/json (body { "vehicleIds": [ ... ] })
GET and PUT routesNo body; parameters in path or query string
Successful JSON responsesapplication/json; charset=utf-8
Token routes in the API Reference: Dashboard user token · API key token.

Response envelope

Successful operations return the payload directly (200 OK with DTO JSON). There is no global wrapper like { "data": ... }. Service-layer results use ApiResult / ApiResult<T> internally; controllers map them to HTTP status codes and return either the DTO or the error object as the JSON body (see Errors).

Response headers

All V2 responses include an API version header:
HeaderTypeDescription
X-API-VersionintegerAlways 2 on V2 responses. Absent on V1 responses.

Rate limiting

Rate limiting is enforced on all V2 endpoints (/api/v2/...). V1 endpoints are not rate-limited. Every V2 response includes the following headers:
HeaderTypeDescription
X-RateLimit-LimitintegerMaximum requests allowed per window for your token
X-RateLimit-RemainingintegerRequests remaining in the current window
X-RateLimit-ResetintegerUnix timestamp when the current window resets
X-RateLimit-PolicystringWhich rate limit window you’re currently closest to hitting — one of second, minute, hour, or day
When a rate limit is exceeded, the server returns 429 Too Many Requests with an additional header:
HeaderTypeDescription
Retry-AfterintegerSeconds to wait before retrying
Retry strategy: Wait the full Retry-After value before retrying. If you receive consecutive 429s, double the wait interval on each attempt up to a maximum of 60 seconds. Limits:
ScopeLimit
Global per token (V2)60 requests / 60 seconds (sliding window)

Pagination

Most V2 list endpoints accept page (1-based, default 1) and pageSize (default 50) query parameters and return:
{
  "items": [...],
  "currentPage": 1,
  "numberOfPages": 7,
  "totalResults": 342,
  "lastResultIndex": 24
}
FieldTypeDescription
itemsarrayRecords on the current page
currentPageintegerCurrent page number (1-based)
numberOfPagesintegerTotal number of pages
totalResultsintegerTotal records across all pages
lastResultIndexintegerIndex of the last record on this page
GET /api/v2/battery-health uses different envelope fields: page, pageSize, and totalCount (instead of currentPage, numberOfPages, totalResults). It also omits lastResultIndex.
V2 pagination parameters:
ParameterDefaultMaxDescription
page1Page to retrieve (1-based)
pageSize50500Records per page
Legacy V1 pagination parameters (applies only to POST /api/GetCompanyVehiclesBatteryHealth):
ParameterDefaultMaxDescription
pageNumber1Page to retrieve (1-based)
resultsPerPage25500Records per page
searchStringOptional filter (name or IMEI)
Endpoints with pagination support:
EndpointParameters
POST /api/GetCompanyVehiclesBatteryHealth (V1 legacy)pageNumber / resultsPerPage
GET /api/v2/companies/{id}/vehicles/last-positionpage / pageSize
GET /api/v2/companies/{id}/alert-recordspage / pageSize
GET /api/v2/companies/{id}/alertspage / pageSize
POST /api/v2/vehicles/listpage / pageSize
GET /api/v2/vehicles/{id}/positionspage / pageSize
GET /api/v2/battery-healthpage / pageSize — returns totalCount instead of totalResults
All other V2 list endpointspage / pageSize

Date and time

  • JSON serialization for DateTime uses custom converters (SimplifiedDateTimeConverter) that write without fractional seconds, e.g. 2026-04-07T14:32:00.
  • Request parameters: pass ISO-like strings that DateTime.Parse accepts (e.g. 2026-04-07T14:32:00 or 2026-04-07T14:32:00Z depending on client). Many actions call DateTime.SpecifyKind(..., Utc) in code—treat replay and position ranges as UTC unless the controller comment says otherwise.
  • TimeSpan in JSON (e.g. trip Duration) uses standard .NET format.

Legacy JSON field names

Several DTOs use legacy spellings for backward compatibility. These apply to V2 endpoints that share the same PositionDto shape as V1:
  • UserTimeFormated, LastMovementTimeUserFormated (missing “t” in “Formatted”)
  • ConnectionStrengh (missing “g” in “Strength”)
Clients should bind to these exact names.
The last-time-online DTOs (LastTimeOnlineDto, DeviceLastTimeOnlineDto) use lastTimeOnlineUtc and secondsAgo — both in standard camelCase. There is no PascalCase legacy variant.

Null vs omitted

  • Nullable reference fields may be omitted or null depending on serializer defaults; treat absent optional fields as null.
  • For PositionDto, isOnline is only set in snapshot-based paths; record-based paths may omit or default it.