Skip to content

Errors & limits

Every v2 response has the same envelope:

{
"data": { },
"meta": { "pagination": { "limit": 50, "offset": 0, "count": 12 } }
}

meta.pagination only appears on list endpoints.

v2 errors carry a stable code you can write code against — switch on error.code, never on error.message, which can change:

{ "error": { "code": "DEVICE_NOT_FOUND", "message": "Dispositivo non trovato." } }
HTTP error.code Meaning
400 IMEI_REQUIRED Missing IMEI in the path
400 BAD_REQUEST Invalid parameters (e.g. history range too wide, from/to not ISO-8601)
400 COORDINATES_REQUIRED Missing lat/lng on /devices/nearest
400 INVALID_COORDINATES lat/lng out of range or not numeric
403 API_KEY_REQUIRED Authenticated but not with an API key (e.g. a web session), or key missing
403 (free text) Missing permission/scope on the key — {"error": "API key senza permesso: <permission>"}
403 FORBIDDEN A specific permission is missing (e.g. commands not enabled for a sub-account)
404 DEVICE_NOT_FOUND Device doesn’t exist or is outside the key’s scope — the two cases aren’t distinguished, so as not to reveal the existence of an IMEI that isn’t yours
404 LOCATION_NOT_FOUND The device hasn’t sent a position yet
429 (no dedicated code) Rate limit exceeded
500 INTERNAL_ERROR Our error
Limit Value
Per key, per minute 120
Per key, per hour 1000
Per IP address, per minute 120

Over the limit: 429. Responses carry no X-RateLimit-* or Retry-After header: size your client around the numbers above, not around a header that doesn’t exist.

Parameter Default Range
limit varies per endpoint (50 or 500 depending on the resource) see the resource’s page
offset 0 ≥ 0

Out-of-range values are clamped, not rejected: limit=99999 becomes the maximum allowed for that endpoint, not an error. meta.pagination.count is the number of items on the current page, not the resource’s total count.