Developer documentation
IoT Integration
OEMs send raw telemetry to AIZEN. Partners receive daily fleet reports via webhook.
Developer documentation
OEMs send raw telemetry to AIZEN. Partners receive daily fleet reports via webhook.
Send raw vehicle and battery telemetry in the original OEM format. Do not transform or aggregate data.
POST /v1/iot/events:batch
Use for production traffic. Send 1–500 events per request; split larger batches into separate requests.
POST /v1/iot/events
Use for testing or low-volume sources. Send one event per request.
Include these headers in every request. AIZEN provides separate staging and production API keys. Keep keys private; missing or invalid keys return 401.
Content-Type: application/json
X-API-Key: your-api-key-here
| Environment | Base URL |
|---|---|
| Production | https://iot-api.aizenmobility.com |
| Staging | https://iot-api.stg.aizenmobility.co.id |
{
"events": [
{ "id": "…", "event_type": "vehicle", "vehicle_type":"string", "payload": { … } },
{ "id": "…", "event_type": "battery", "vehicle_type":"string", "payload": { … } }
]
}
{
"id":"string",
"event_type":"string",
"vehicle_type":"string",
"payload": {}
}
All four fields are required.
| Field | Type | Description |
|---|---|---|
id |
string | Unique physical source ID: VIN or vehicle ID for vehicle events; battery ID for battery events. Do not use a trip ID. |
event_type |
string | vehicle for GPS, movement, and vehicle status; battery for charging, voltage, and temperature. |
vehicle_type |
string | OEM-defined vehicle model or variant. |
payload |
object | Raw telemetry as a valid JSON object in the original OEM structure. |
POST /v1/iot/events:batch
X-API-Key: your-api-key-here
Content-Type: application/json
{
"events": [
{
"id": "MX69112200547506",
"event_type": "vehicle",
"vehicle_type":"E-Scooter Pro",
"payload": {
"dataTime": 1783987597177,
"status": "STOP",
"ignition_status": "OFF",
"movement_status": "false",
"speed": 30,
"soc": 57,
"soh": 99,
"latitude": -6.426598,
"longitude": 106.770133
}
},
{
"id": "ZZ00384100154922",
"event_type": "battery",
"vehicle_type":"E-Bike Model X",
"payload": {
"dataTime": 1783987575519,
"status":"CHARGING",
"voltage": 78100,
"soc": "97",
"soh": "98",
"latitude": -6.426598,
"longitude": 106.770133
}
}
]
}
{
"id":"VIN-ABC123XYZ456",
"event_type":"vehicle",
"vehicle_type":"E-Scooter Pro",
"payload": {
"timestamp":"2025-01-15T10:30:45Z",
"vin":"VIN-ABC123XYZ456",
"motorcycle_id":"MC-2024-001",
"battery_current":-12.5,
"battery_id":"BAT-789456",
"movement_status": "false",
"battery_temperature":32.5,
"battery_voltage":52.3,
"ignition":true,
"imei":"350612078626668",
"latitude":-6.2088,
"longitude":106.8456,
"odometer":1523.4,
"plate_number":"B 1234 ABC",
"soc":85,
"soh":99,
"speed":45.5,
"status":"moving"
}
}
{
"id":"BAT-789456",
"event_type":"battery",
"vehicle_type":"E-Bike Model X",
"payload": {
"status":"CHARGING",
"timestamp":"2025-01-15T16:57:23Z",
"battery_id":"BAT-789456",
"vin":"VIN-ABC123XYZ456",
"capacity":23475,
"cell_voltage_max":4173,
"cell_voltage_min":3677,
"charging_status":true,
"current":8.5,
"latitude":-6.2762416,
"longitude":106.910805,
"motorcycle_id":"MC-2024-001",
"soc":47,
"soh":100,
"temperature":35,
"voltage":73.6
}
}
202 Accepted confirms receipt for asynchronous processing. Batch requests can be partially accepted; always check rejected.
{
"status": "accepted",
"accepted": 500,
"rejected": [],
"event_ids": ["evt_…", "evt_…"],
"timestamp": "2026-07-14T10:30:01.234Z"
}
{
"status": "accepted",
"accepted": 498,
"rejected": [
{ "index": 12, "error": "missing timestamp in payload" },
{ "index": 88, "error": "could not resolve identifier" }
],
"event_ids": ["evt_…"],
"timestamp": "2026-07-14T10:30:01.234Z"
}
{
"status":"accepted",
"event_id":"evt_1a2b3c4d5e6f7g8h9i0j",
"timestamp":"2025-01-15T10:30:01.234Z"
}
| Status | Meaning | Action |
|---|---|---|
| 400 | Invalid single event | Correct and resend. |
| 401 | Missing or invalid API key | Check X-API-Key. |
| 422 | Invalid body: non-array events, more than 500 events, or missing event_type. |
Correct the request body. |
| 503 | Temporarily unavailable | Retry with backoff. |
Service unavailable:
{"status":"error","error_code":"SERVICE_UNAVAILABLE","message":"Please retry","timestamp":"…"}
timestamp: telemetry time.vin, battery_id, or motorcycle_id.| Field | Description |
|---|---|
timestamp |
Telemetry timestamp |
vin |
Vehicle identifier |
motorcycle_id |
Internal vehicle ID |
latitude, longitude |
GPS location |
speed |
Vehicle speed |
odometer |
Total distance |
soc |
Battery level |
soh |
Battery health |
ignition |
Ignition status |
movement |
Movement status |
| Field | Description |
|---|---|
timestamp |
Telemetry timestamp |
battery_id |
Battery ID |
soc |
Battery level |
soh |
Battery health |
temperature |
Battery temperature |
voltage |
Battery voltage |
charging_status |
Charging state |
Duplicate events can occur. Keep source IDs stable and agree on event deduplication with AIZEN.
AIZEN sends aggregated daily fleet reports to your HTTPS endpoint using a standardized payload.
Provide an HTTPS endpoint that:
POST requests with application/json payloads.2xx when the payload is received.POST https://partner-domain.com/webhooks/aizen/fleet-daily-report
Content-Type: application/json
Validate each request using the shared bearer token agreed with AIZEN. All deliveries use HTTPS.
Authorization: Bearer <shared-token>
All partners use the same payload schema. Timestamps are UTC.
{
"event_type": "fleet.daily_report",
"schema_version": "1.0",
"report_date": "2026-03-25",
"generated_at": "2026-03-26T00:05:00Z",
"batch_id": "rpt_abc123",
"batch_sequence": 1,
"batch_total": 5,
"vehicles": [
{
"vin": "...",
"trip_summary": {
"total_trips": 5,
"total_distance_km": 42.3,
"total_energy_consumed_kwh": 2.1,
"odometer_end_km": 1234.5,
"avg_speed_kph": 28.4
},
"battery": {
"avg_level_pct": 65,
"avg_health_pct": 92
},
"last_location": {
"latitude": -6.123,
"longitude": 106.456,
"recorded_at": "2026-03-25T22:45:00Z"
},
"impact": {
"estimated_co2e_reduced_kg": 6.77,
"calculation_method": "v1"
}
}
]
}
All fields are required.
| Field | Type | Description |
|---|---|---|
event_type |
string | fleet.daily_report |
schema_version |
string | Payload schema version. |
report_date |
string (date) | Report date (YYYY-MM-DD). |
generated_at |
string (datetime) | Generation time (ISO 8601 UTC). |
batch_id |
string | Unique report batch ID. |
batch_sequence |
integer | Current batch number. |
batch_total |
integer | Total batch count. |
vehicles |
array | Vehicle summaries. |
All fields are required.
| Field | Type | Description |
|---|---|---|
vin |
string | Vehicle identifier (VIN). |
trip_summary |
object | Daily trip metrics. |
battery |
object | Battery level and health. |
last_location |
object | Last recorded location. |
impact |
object | Estimated avoided emissions. |
trip_summary| Field | Type | Description |
|---|---|---|
total_trips |
integer | Daily trip count. |
total_distance_km |
number | Daily distance traveled. |
total_energy_consumed_kwh |
number | Daily energy consumed (kWh). |
odometer_end_km |
number | End-of-day odometer. |
avg_speed_kph |
number | Average speed across daily trips. |
battery| Field | Type | Description |
|---|---|---|
avg_level_pct |
number | Average battery level (%). |
avg_health_pct |
number | Battery health (%). |
last_location| Field | Type | Description |
|---|---|---|
latitude |
number | Latitude |
longitude |
number | Longitude |
recorded_at |
datetime | Location timestamp. |
impact| Field | Type | Description |
|---|---|---|
estimated_co2e_reduced_kg |
number | Estimated avoided emissions (kg CO₂e). |
calculation_method |
string | Calculation method version. |
estimated_co2e_reduced_kg estimates the greenhouse gas emissions avoided by using an electric vehicle instead of a combustion-engine vehicle.
GHG Avoided (kg CO₂e) =
(distance_km ÷ fuel_efficiency_km_per_liter)
× 44.3 (NCV of gasoline)
× 18.9 (emission factor)
× (44/12) (converts kg Carbon to kg CO₂)
÷ 1000
Reports are delivered daily in one or more batches. Delivery is at least once; duplicates can occur.
Batches may arrive out of order. Use batch_id to identify the report batch, batch_sequence to order its batches, and batch_total to verify completeness.
{
"batch_id":"rpt_abc123",
"batch_sequence":1,
"batch_total":5
}
Process duplicate deliveries idempotently using:
batch_id + batch_sequence
| Condition | Handling |
|---|---|
Timeout, network failure, or HTTP 5xx | Temporary failure. Retry up to 3 times at 10-minute intervals. |
HTTP 2xx | Success. No retry. |
HTTP 4xx | Invalid request. Permanent failure; no retry. |
After the final failed attempt, delivery is marked as failed. Use the Replay API to recover missed reports.
Recover missed reports after webhook retries are exhausted.
GET /reports?date=YYYY-MM-DD
GET /reports?date=2026-03-01
Authorization: Bearer <shared-token>
Returns the webhook payload structure for the requested date. Results may be paginated or batched.