API overview
What the LemursEye API is, the conventions every endpoint follows, errors and limits.
The LemursEye API is the same API the console and the mobile app use. Anything you can see or do in the console, a program can do too: read live positions and trips, pull the daily fuel and cost per vehicle, receive alerts, plan trips, manage vehicles and trackers.
Typical uses:
- ERP and accounting (Odoo, SAP, your own): pull each day's litres and cost per vehicle, and post them as expenses.
- Your own dashboards: trips, distances and idle time per vehicle, per day.
- Operations software: create planned trips from your orders, read back which stops were done.
- Live tracking in your app: stream positions over the live socket.
Base URL
https://lemurseye.com/api/v1/
All requests and responses are JSON over HTTPS (Content-Type: application/json). Every request needs a bearer token: see Authentication.
Your company is in the token
Every call is scoped to the company (the tenant) the token belongs to. You never pass a company id, and you can never read or change another company's data: an id that belongs to someone else answers 404 Not Found, exactly as if it did not exist.
Conventions
| Thing | Format | Example |
|---|---|---|
| Ids | UUID | 7fc349e7-f83d-4072-9e98-0b0b00ff27dc |
| Times | ISO 8601 with offset; responses are in UTC | 2026-10-25T08:10:41Z |
| Dates | YYYY-MM-DD, in the company's time zone | 2026-10-25 |
| Distance | kilometres | 133.6 |
| Speed | km/h | 78 |
| Durations | seconds, in fields ending Seconds or S | drivingSeconds: 12660 |
| Fuel | litres | fuelLitres: 16.1 |
| Money | a number plus the company's ISO 4217 currency code | fuelCost: 17.7, currency: "USD" |
| Coordinates | WGS 84 decimal degrees | latitude: 30.0444, longitude: 31.2357 |
Fields with no value are null rather than missing. Lists come back newest first unless the page says otherwise.
Permissions
A token carries the permissions of the person or API key it belongs to. Each endpoint names the permission it needs, for example fleet:read or dispatch:write. Without it the answer is 403 Forbidden.
| Permission | Lets you |
|---|---|
fleet:read, fleet:write | Read and change vehicles and their live state |
trips:read | Trips, stops and history |
device:read, device:write | Read and register trackers |
drivers:read, drivers:write | Read and change drivers, issue app codes |
alerts:read, alerts:ack | Read alerts, acknowledge them |
rules:write | Change alert rules |
geofence:read, geofence:write | Read and change places and zones |
dispatch:read, dispatch:write | Planned trips and routes |
money:read | Fuel prices and costs |
reports:read, digest:generate | Read reports and digests, generate one on demand |
settings:read, settings:write | Currency, fuel prices, calendar |
modules:read, modules:write | See and switch the company's apps |
users:read | See people and their roles |
users:write, roles:manage, integrations:manage | Invite people, change roles, make API keys. People only: an API key never holds these |
An owner can see and change what each role holds on the Roles page.
Errors
Errors use the usual HTTP status codes. Most carry a JSON body with a readable error, and some also a machine-readable code:
{ "error": "This is the company's only active owner. Make someone else owner first.", "code": "last_owner" }
| Status | Meaning | What to do |
|---|---|---|
400 | The request is invalid: a missing field, a bad date | Fix the request; error says what is wrong |
401 | No token, or it expired | Get a new token and retry |
403 | The token lacks the permission | Use a role that has it |
404 | Not found, or not yours | Check the id |
409 | Conflicts with the current state: an IMEI already registered, editing a trip that started | Read error; the request will not succeed as it is |
429 | Too many attempts (sign-in endpoints) | Wait a few minutes |
5xx | A fault on our side | Retry with backoff; tell us if it persists |
Limits
- Lists take a
limit(default and maximum are given per endpoint; alerts allow up to 500). - Date ranges are capped where they could get large: planned trips up to 62 days at a time.
- Retry
5xxand network errors with exponential backoff, starting at one second.
Versioning
The path carries the version (/api/v1/). Within v1 we only add: new endpoints, new optional fields, new values in lists. Ignore fields you do not know. Anything that would break a client gets a new version, announced in advance.