Skip to main content

Telemetry Ingestion

Ingest batches of GPS and sensor data from tracking devices.

POST/apidev/v1/telemetry
PermissionAPICLI_POST_TELEMETRY
Rate LimitToken bucket — 180 capacity, 30/sec refill
CacheNone

Overview

Accepts arrays of GPS and sensor data points from tracking devices. Uses a fire-and-forget pattern: the server validates the payload, returns 200 OK with an acceptance count, and processes the data asynchronously in the background.

A successful response confirms the points were accepted for processing — not that they have been persisted yet.


Request

Body

The request body is a JSON array of telemetry point objects:

FieldTypeRequiredMax LengthDescription
imeistringYes50Device IMEI identifier
eventcodestringYes20Event code — see Event codes table below
fixbooleanYesWhether the GPS has a valid fix
datetimestringYes40Timestamp of the reading (ISO 8601, no timezone)
latitudestringYes25Latitude in decimal degrees
longitudestringYes25Longitude in decimal degrees
altitudenumberYesAltitude in meters
speednumberYesSpeed in km/h
headingnumberYesHeading in degrees (0–360)
satellitesintegerNoNumber of visible GPS satellites
ignitionbooleanNoIgnition state
accuracystringNo30GPS accuracy in meters
odometerstringNo50Odometer reading in km
horometernumberNoHour meter reading
addressstringNo500Reverse-geocoded address

Event Codes

The eventcode field must be one of the following values:

CodeEventDescription
101POSICIONPeriodic position report
113POSICION_STANDBYPosition report in standby mode
116BATTERY_LOWLow battery alert
117EXCESO_VELOCIDADSpeed limit exceeded
118IGNICION_ONIgnition turned on
119IGNICION_OFFIgnition turned off
120POWER_ONExternal power connected
121POWER_OFFExternal power disconnected
122INPUT01_ONInput 1 activated
123INPUT01_OFFInput 1 deactivated
124INPUT02_ONInput 2 activated
125INPUT02_OFFInput 2 deactivated
126INPUT03_ONInput 3 activated
127INPUT03_OFFInput 3 deactivated
128OUTPUT01_ONOutput 1 activated
129OUTPUT01_OFFOutput 1 deactivated
130OUTPUT02_ONOutput 2 activated
131OUTPUT02_OFFOutput 2 deactivated
132OUTPUT03_ONOutput 3 activated
133OUTPUT03_OFFOutput 3 deactivated
149REMOLQUE_INICIOTrailer attached
150REMOLQUE_FINTrailer detached
151BATERIA_EXT_LOWExternal battery low
152BATERIA_INT_LOWInternal battery low
153POWER_UPDevice power up
162COLISIONCollision detected
163ACELERACIONBRUSCAHarsh acceleration
164FRENADOBRUSCOHarsh braking
165GIROBRUSCOHarsh cornering
Whitelist enforced

Unknown fields in the body are rejected. Only the fields listed above are accepted — any extra property triggers a VALIDATION_ERROR.


Code Examples

curl -s -X POST "https://$TENANT/apidev/v1/telemetry" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '[
{
"imei": "352093081234567",
"eventcode": "101",
"fix": true,
"datetime": "2026-04-04T14:30:00",
"latitude": "-34.6037",
"longitude": "-58.3816",
"altitude": 25,
"speed": 45,
"heading": 180,
"satellites": 12,
"ignition": true,
"odometer": "125430",
"accuracy": "3.5"
},
{
"imei": "352093081234567",
"eventcode": "101",
"fix": true,
"datetime": "2026-04-04T14:30:30",
"latitude": "-34.6040",
"longitude": "-58.3820",
"altitude": 25,
"speed": 48,
"heading": 185
}
]'

Response

Success — 200 OK

FieldTypeDescription
successbooleantrue — points accepted for async processing
data.acceptedintegerNumber of telemetry points accepted
data.rejectedintegerNumber of points rejected (currently always 0 on success)
data.statusstringProcessing status ("OK")
metaobjectEmpty object
{
"success": true,
"data": {
"accepted": 2,
"rejected": 0,
"status": "OK"
},
"meta": {}
}
Fire-and-forget

A 200 OK confirms the points passed validation and were enqueued. Processing happens asynchronously — data may not be queryable via the Device Position endpoint immediately.


Rate Limiting

Telemetry uses a token bucket algorithm at two levels. See Rate Limits for the full explanation.

ParameterGlobal (per user)Per IMEI
Bucket capacity180 tokens90 tokens
Refill rate30 tokens/sec15 tokens/sec
Cost per requestceil(points / 20) tokensceil(points / 20) tokens

Examples:

  • 1 point = 1 token → you can send ~180 single-point requests before the bucket empties
  • 100 points = 5 tokens → you can send ~36 batches of 100 before the bucket empties
  • Sustained throughput: ~600 points/sec globally, ~300 points/sec per device

Errors

CodeHTTPDescription
BAD_REQUEST400Missing required headers
VALIDATION_ERROR400Invalid or missing fields, unknown properties, or body is not an array
UNAUTHORIZED401Invalid or expired JWT / API Key
RATE_LIMITED429Token bucket exhausted (global or per-IMEI)
INTERNAL_ERROR500Unexpected server error during ingestion

Best Practices

  • Batch your points — send up to 100 points per request for optimal throughput-to-token-cost ratio
  • One IMEI per batch when possible — avoids per-IMEI bucket contention across devices
  • Monitor rate limit headers — check X-RateLimit-Remaining to throttle before hitting 429
  • Timestamps without timezone — send as "2026-04-04T14:30:00", not "2026-04-04T14:30:00Z"
  • GPS fix = false — the server accepts the point but coordinates may be unreliable