Nodeflux Central
Events

API Reference: Events

Endpoint REST untuk membaca arsip event per kategori dengan cursor-based pagination, opsi filter, detail event, ekspor asinkron, serta WebSocket channel untuk feed event real-time.

Semua endpoint memerlukan otentikasi. Untuk integrasi, kirim header X-Api-Key: <key> di setiap request tanpa header Authorization. Bearer token (Authorization: Bearer <access_token>, berlaku 30 menit) hanya untuk aplikasi yang menampilkan login Lenz ke penggunanya sendiri dan wajib menyertakan X-Integration-Signature. Basis URL mengikuti variabel lingkungan VITE_API_URL yang dikonfigurasi pada instalasi Lenz. Lihat Otentikasi untuk memilih jalur yang tepat.


Arsip Event

Endpoint yang dipakai halaman Event History untuk membaca event per kategori (fra, mpaa, mvaa, ce, lpr, ppe, general). Pagination berbasis cursor: kirim cursor=<data.pagination.next_cursor> dari respons sebelumnya untuk halaman berikutnya, dan include_total=true bila Anda perlu jumlah total. Filter dikirim sebagai filter[<nama>] (pencocokan persis, beberapa nilai dipisah koma) dan pencarian sebagai search[<nama>] (pencocokan sebagian). Hasil selalu dibatasi ke stream yang boleh diakses oleh pengguna atau API key yang dipakai.

Daftar Event

GET
/api/event-history/{category}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

category*string

Kategori analitik: fra, mpaa, mvaa, ce, lpr, ppe, atau general.

Value in"fra" | "mpaa" | "mvaa" | "ce" | "lpr" | "ppe" | "general"

Query Parameters

limit?integer

Jumlah event per halaman. Default 20, maksimum 100 (nilai lebih besar dipotong ke 100).

Default20
Rangevalue <= 100
cursor?string

Cursor halaman berikutnya, diperoleh dari data.pagination.next_cursor pada respons sebelumnya. Cursor tidak valid menghasilkan 400.

include_total?boolean

true untuk menyertakan data.pagination.total. Berguna untuk menampilkan jumlah total, tetapi memperlambat query pada dataset besar.

Defaultfalse
sort?string

Format field:direction. Field yang diizinkan bergantung kategori: FRA event_time|keyword|status|created_at; MPAA/PPE event_time|area|direction|dwelling_duration|created_at; MVAA event_time|area|direction|dwelling_duration|vehicle_type|created_at; CE event_time|estimation|area|created_at; LPR event_time|plate_number|vehicle_type|created_at. Field lain dikembalikan ke default event_time:desc.

timezone?string

Zona waktu IANA untuk mem-parsing filter[timestamp_*] berformat tanggal saja dan untuk memformat event_time pada respons. Default UTC.

instance?string

Mode Federation: ID instance target. Beberapa instance dipisah koma (instance=a,b) dan otomatis diperlakukan sebagai agregasi.

is_aggregated?boolean

Mode Federation: true tanpa instance untuk fan-out ke semua instance. Federation Module menggabungkan hasil, mengurutkan ulang berdasarkan (event_time, event_id), dan membangun ulang next_cursor.

filter[timestamp_from]?string

Batas awal waktu event. RFC 3339, atau YYYY-MM-DD (diselaraskan ke awal hari pada timezone).

filter[timestamp_to]?string

Batas akhir waktu event. RFC 3339, atau YYYY-MM-DD (diselaraskan ke akhir hari pada timezone).

filter[stream_ids]?string

ID stream, pisahkan koma untuk beberapa stream. Selalu diiris dengan stream yang boleh diakses pengguna/API key.

filter[analytic_ids]?string

ID analitik engine, pisahkan koma.

filter[event_ids]?string

Daftar Event ID persis, pisahkan koma. Dipakai ekspor Halaman Saat Ini.

filter[status]?string

Status deteksi. FRA: KNOWN,UNKNOWN; LPR: status pendaftaran plat. Pisahkan koma untuk beberapa nilai.

filter[gender]?string

Jenis kelamin (FRA/MPAA). Nilai mengikuti opsi /filters, mis. Male,Female.

filter[age]?string

Kelompok usia (FRA/MPAA), mis. Adult,Child,Elderly.

filter[mask]?string

Masker (FRA/MPAA). Nilai mengikuti opsi /filters.

filter[glasses]?string

Kacamata (FRA/MPAA).

filter[head_covering]?string

Penutup kepala (FRA/MPAA).

filter[face_expression]?string

Ekspresi wajah (FRA/MPAA).

filter[upper_color]?string

Warna pakaian atas (FRA/MPAA).

filter[lower_color]?string

Warna pakaian bawah (FRA/MPAA).

filter[body_type]?string

Tipe tubuh (MPAA, pipeline MPA2).

filter[gloves]?string

Sarung tangan (MPAA, PPE).

filter[upper_cloth]?string

Jenis pakaian atas (MPAA).

filter[lower_cloth]?string

Jenis pakaian bawah (MPAA).

filter[footwear_color]?string

Warna alas kaki (MPAA).

filter[area]?string

Nama area/garis (MPAA/MVAA/CE/PPE). Pisahkan koma untuk beberapa area.

filter[direction]?string

Arah pergerakan in atau out (MPAA/MVAA/LPR/PPE).

filter[logic_type]?string

Logic type (MPAA/MVAA/PPE): counting, dwelling, density, dan speed (khusus MVAA).

filter[from_line]?string

Garis asal pada logic line-crossing (MPAA/PPE).

filter[to_line]?string

Garis tujuan pada logic line-crossing (MPAA/PPE).

filter[vehicle_type]?string

Tipe kendaraan (MVAA/LPR), mis. car,motorcycle,bus,truck.

filter[brand]?string

Merek kendaraan (MVAA), pencocokan persis. Untuk pencocokan sebagian gunakan search[brand].

filter[color]?string

Warna kendaraan (MVAA).

filter[vehicle_advance]?string

Atribut Vehicle Advance (MVAA).

filter[plate_type]?string

Tipe plat (LPR).

filter[safety_glasses]?string

Kacamata pengaman (PPE).

filter[face_shield]?string

Pelindung wajah (PPE).

filter[safety_harness]?string

Tali pengaman (PPE).

filter[head_protection]?string

Pelindung kepala (PPE).

filter[helmet_color]?string

Warna helm (PPE).

filter[face_mask]?string

Masker wajah (PPE).

filter[protective_clothing]?string

Pakaian pelindung (PPE).

filter[protective_clothing_color]?string

Warna pakaian pelindung (PPE).

filter[footwear_type]?string

Jenis alas kaki (PPE).

filter[work_context]?string

Konteks kerja (PPE).

filter[labels]?string

Label deteksi (General), pisahkan koma.

search[event_id]?string

Pencocokan sebagian (case-insensitive) pada Event ID; berlaku untuk semua kategori kecuali general.

search[keyword]?string

Pencocokan sebagian pada keyword/label hasil pengenalan (FRA).

search[face_id]?string

Pencocokan sebagian pada face_id (FRA).

search[brand]?string

Pencocokan sebagian pada merek kendaraan (MVAA).

search[plate_number]?string

Pencocokan sebagian pada nomor plat (LPR).

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://lenz.example.com/api/event-history/fra?limit=20&sort=event_time%3Adesc&timezone=Asia%2FJakarta&instance=remote-jakarta&filter%5Btimestamp_from%5D=2026-04-30T00%3A00%3A00%2B07%3A00&filter%5Btimestamp_to%5D=2026-04-30T23%3A59%3A59%2B07%3A00&filter%5Bstream_ids%5D=eb7022a64d9173a6%2Cc1105b1c6e6b4f3a&filter%5Banalytic_ids%5D=NFV4-FR%2CNFV4-FRA&filter%5Bstatus%5D=KNOWN&filter%5Blogic_type%5D=counting%2Cdwelling&search%5Bevent_id%5D=a6d87102&search%5Bplate_number%5D=B+1234"
{  "ok": true,  "data": {    "analytics_type": "fra",    "events": [      {        "id": "01HXYZ1234567890ABCDEF",        "event_id": "1780473522-a6d87102",        "analytic_id": "NFV4-FR",        "stream_id": "eb7022a64d9173a6",        "stream_name": "Kamera Lobby Utama",        "primary_image_url": "/api/attachments?owner_type=primary&owner_id=1780473522-a6d87102",        "secondary_image_url": "/api/attachments?owner_type=secondary&owner_id=1780473522-a6d87102",        "label": "UNKNOWN",        "location": "Lobby Utama",        "event_time": "2026-04-30T08:23:45+07:00",        "created_at": "2026-04-30T08:23:46+07:00",        "status": "UNKNOWN",        "face_id": "118747588341006337",        "similarity": 0.4894,        "gender": "Male",        "age": "Adult",        "mask": "No Mask",        "glasses": "No Glasses",        "head_covering": "None",        "upper_color": "Black",        "face_expression": "neutral",        "stream_latitude": -6.2088,        "stream_longitude": 106.8456,        "metadata": {          "enrolled_face_metadata": null        }      }    ],    "pagination": {      "limit": 20,      "has_next": true,      "has_prev": false,      "next_cursor": "eyJpZCI6IjE2MzQ1NiJ9",      "prev_cursor": null,      "total": 1240    }  }}
{  "ok": false,  "code": "bad-request",  "errors": [],  "message": "unsupported category: xyz"}
{  "ok": false,  "message": "unauthorized"}
{  "ok": false,  "code": "forbidden",  "message": "forbidden"}

Detail Event

Respons daftar sudah berisi seluruh atribut yang ditampilkan tabel. Untuk data lengkap satu event (gambar base64, pipeline_data mentah, koordinat stream), panel detail memanggil endpoint di bawah dengan event_id dari respons daftar. Tidak ada endpoint detail per kategori di bawah /api/event-history.

GET
/api/events/pipeline/{pipeline_event_id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

pipeline_event_id*string

Pipeline event ID yang ada di dalam pipeline_data.event_id

Query Parameters

instance?string

ID instance sumber pada mode Federation (opsional)

Response Body

application/json

curl -X GET "https://lenz.example.com/api/events/pipeline/evt-uuid-001"
{  "ok": true,  "message": "successfully fetch event data",  "data": {    "id": 4821,    "analytic_id": "NFV4-FR",    "stream_id": "stream-abc123",    "pipeline_data": {      "event_id": "evt-uuid-001"    }  }}
Empty
Empty

Opsi Filter

Nilai yang tersedia untuk setiap dimensi filter pada satu kategori, misalnya daftar status, warna, area, atau label yang sudah pernah terdeteksi, digabung dengan pool nilai yang dideklarasikan konfigurasi rules pipeline. UI memakainya untuk mengisi checkbox dan chip warna di panel Filter; integrasi dapat memakainya untuk memvalidasi nilai filter[...] sebelum mengirim query.

Opsi Filter Event

GET
/api/event-history/{category}/filters

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

category*string

Kategori analitik: fra, mpaa, mvaa, ce, lpr, ppe, atau general.

Value in"fra" | "mpaa" | "mvaa" | "ce" | "lpr" | "ppe" | "general"

Query Parameters

logic_type?string

Batasi opsi ke satu logic type: counting, dwelling, atau density. Nilai lain menghasilkan 400.

Value in"counting" | "dwelling" | "density"
timestamp_from?string

Awal rentang yang sedang dilihat (RFC 3339 atau YYYY-MM-DD). Opsi area milik stream yang dihapus sebelum waktu ini disembunyikan.

timezone?string

Zona waktu untuk mem-parsing timestamp_from berformat tanggal saja. Default UTC.

instance?string

Mode Federation: ID instance target.

is_aggregated?boolean

Mode Federation: true untuk menggabungkan opsi dari semua instance (federer melakukan union pada data.filters dan data.filter_contexts).

Response Body

application/json

application/json

curl -X GET "https://lenz.example.com/api/event-history/fra/filters?timestamp_from=2026-04-30T00%3A00%3A00%2B07%3A00&timezone=Asia%2FJakarta&instance=remote-jakarta"
{  "ok": true,  "data": {    "category": "fra",    "logic_type": null,    "filters": {      "status": [        "KNOWN",        "UNKNOWN"      ],      "gender": [        "Male",        "Female"      ],      "age": [        "Adult",        "Child",        "Elderly",        "Unknown"      ],      "mask": [        "Mask",        "No Mask"      ],      "glasses": [        "Glasses",        "No Glasses"      ],      "head_covering": [        "None",        "Hat",        "Hijab"      ],      "face_expression": [        "neutral",        "happy"      ],      "upper_color": [        "Black",        "Blue",        "White"      ],      "lower_color": [        "Black",        "Blue"      ]    },    "last_updated": "2026-04-30T08:00:00Z",    "filter_contexts": null  }}
{  "ok": false,  "code": "bad-request",  "message": "invalid category: must be fra, mpaa, mvaa, ce, lpr, ppe, or general"}

Ekspor

Ekspor berjalan sebagai job asinkron di server. Alurnya: buat job dengan POST .../export (lingkup current_page dengan daftar event_ids, atau all dengan objek filters yang sama dengan query daftar), poll statusnya, lalu unduh file PDF, XLSX, atau ZIP ketika status completed. File yang sudah diunduh tidak dapat diunduh ulang. Di mode Federation, kirim instance=<id> pada keempat request agar job dijalankan pada instance pemilik data; UI membuat satu job per instance.

Mulai Job Ekspor

POST
/api/event-history/{category}/export

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

category*string

Kategori analitik yang diekspor. Nilai yang valid: FRA (Face Recognition Attributes), MPAA (Multi People Attribute Analytics), MVAA (Multi Vehicle Attribute Analytics), CE (Crowd Estimation), LPR (License Plate Recognition).

Value in"FRA" | "MPAA" | "MVAA" | "CE" | "LPR"

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://lenz.example.com/api/event-history/FRA/export" \  -H "Content-Type: application/json" \  -d '{    "format": "pdf",    "scope": "all",    "timezone": "Asia/Jakarta",    "include_images": true,    "filters": {      "timestamp_from": "2024-01-15T00:00:00+07:00",      "timestamp_to": "2024-01-15T23:59:59+07:00",      "stream_ids": [        "stream-abc123"      ],      "analytic_ids": [        "NFV4-FRA"      ]    }  }'
{  "ok": true,  "message": "Export job initiated",  "data": {    "job_id": "export-job-uuid-001",    "status": "pending",    "estimated_records": 1420,    "message": "Export job queued successfully"  }}
Empty

Status Job Ekspor

GET
/api/event-history/{category}/export/status/{job_id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

category*string

Kategori analitik (sama dengan yang digunakan saat inisiasi job)

Value in"FRA" | "MPAA" | "MVAA" | "CE" | "LPR"
job_id*string

ID job export yang diperoleh dari respons inisiasi

Response Body

application/json

curl -X GET "https://lenz.example.com/api/event-history/FRA/export/status/export-job-uuid-001"
{  "ok": true,  "data": {    "job_id": "export-job-uuid-001",    "status": "running",    "progress": {      "processed": 712,      "total": 1420,      "percent": 50    },    "files_ready": 0,    "total_files": 1,    "error_message": null,    "created_at": "2024-01-15T10:00:00Z",    "updated_at": "2024-01-15T10:00:30Z"  }}
Empty
Empty

Unduh Hasil Ekspor

GET
/api/event-history/{category}/export/download/{job_id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

category*string

Kategori analitik (sama dengan yang digunakan saat inisiasi job)

Value in"FRA" | "MPAA" | "MVAA" | "CE" | "LPR"
job_id*string

ID job export yang sudah berstatus completed

Response Body

curl -X GET "https://lenz.example.com/api/event-history/FRA/export/download/export-job-uuid-001"
"string"
Empty
Empty

Batalkan Job Ekspor

DELETE
/api/event-history/{category}/export/{job_id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

category*string

Kategori analitik (sama dengan yang digunakan saat inisiasi job)

Value in"FRA" | "MPAA" | "MVAA" | "CE" | "LPR"
job_id*string

ID job export yang akan dibatalkan

Response Body

application/json

curl -X DELETE "https://lenz.example.com/api/event-history/FRA/export/export-job-uuid-001"
{  "ok": true,  "message": "Export job cancelled"}
Empty
Empty

Pencarian

Mode Smart Search pada halaman Event History memanggil GET /api/smart-search dengan parameter search, limit, timezone, last_score (cursor berbasis skor), serta filter[timestamp_from] dan filter[timestamp_to]. Endpoint ini dan endpoint gambar pendampingnya didokumentasikan di API Reference: Search.


Webhook & Streaming

Dua WebSocket channel tersedia untuk menerima event secara real-time tanpa polling. /api/event_channel mengirim setiap deteksi yang lewat pipeline dan bersifat publik; /api/alert_channel hanya mengirim event yang lolos Alert Rule aktif, memerlukan authorization=<access_token> atau x-api-key=<key> sebagai query parameter, dan dibatasi ke stream yang boleh diakses.

Kedua endpoint menggunakan protokol WebSocket, bukan HTTP biasa. Gunakan ws:// atau wss:// sebagai skema URL dan kirim kredensial sebagai query parameter karena browser tidak dapat mengatur header saat handshake. Lihat Otentikasi: WebSocket untuk detail masa berlaku token, dan bagian WebSocket Protocol untuk Integrator untuk struktur payload dan pola reconnect.

WebSocket Event Channel

GET
/api/event_channel

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Query Parameters

stream_ids?string

ID stream yang ingin dimonitor, pisahkan koma. Kosong berarti semua stream.

stream_id?string

Bentuk tunggal dari stream_ids; dipertahankan untuk kompatibilitas.

analytic_id?string

ID analitik yang ingin diterima, pisahkan koma.

node_num?integer

Nomor node Visionaire (default 0).

Default0
logic?string

Hanya event dengan logic type tertentu.

disable_base64_image?boolean

true untuk tidak menyertakan gambar base64. primary_image_url/secondary_image_url tetap dikirim. Sangat disarankan pada volume tinggi.

Defaultfalse
instance?string

Mode Federation: ID instance sumber (ditangani federer).

is_aggregated?boolean

Mode Federation: true untuk menerima event dari semua instance (ditangani federer).

Response Body

curl -X GET "https://lenz.example.com/api/event_channel?stream_ids=eb7022a64d9173a6%2Cc1105b1c6e6b4f3a&analytic_id=NFV4-FR%2CNFV4-LPR&logic=counting&instance=remote-jakarta"
Empty
Empty

WebSocket Alert Channel

GET
/api/alert_channel

Query Parameters

x-api-key?string

API key untuk integrasi. Wajib salah satu dari x-api-key atau authorization.

authorization?string

Access token sesi pengguna (berlaku 30 menit), dengan atau tanpa awalan Bearer . Alternatif dari x-api-key.

disable_base64_image?boolean

Set true agar primary_image/secondary_image tidak disertakan; ambil gambar lewat primary_image_url saat dibutuhkan. Sangat disarankan pada volume tinggi.

Defaultfalse
is_aggregated?boolean

Mode Federation: set true untuk menerima alert dari instance lokal dan semua remote instance. Lenz mengaktifkan ini otomatis saat berjalan dalam mode Federation.

Defaultfalse
instance?string

Mode Federation: berlangganan hanya ke satu remote instance tertentu. Kosongkan atau isi core untuk instance lokal.

Response Body

application/json

application/json

curl -X GET "https://lenz.example.com/api/alert_channel?x-api-key=%3Ckey%3E&authorization=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
{  "event_id": "3f1a9c2e-7b4d-4e0a-9c1b-2d5f6a7b8c9d",  "alert_type_id": 2,  "analytic_id": "NFV4-FR",  "stream_id": "eb7022a64d9173a6",  "node_num": 0,  "label": "UNKNOWN",  "location": "Lobby Utama",  "result": "UNKNOWN",  "status": "UNKNOWN",  "logic": "face_recognition",  "timestamp": "2026-04-30T08:23:45+07:00",  "instance": "cabang-bandung",  "primary_image": "string",  "secondary_image": "string",  "primary_image_url": "event_id=3f1a9c2e-7b4d-4e0a-9c1b-2d5f6a7b8c9d&type=primary",  "secondary_image_url": "event_id=3f1a9c2e-7b4d-4e0a-9c1b-2d5f6a7b8c9d&type=secondary",  "pipeline_data": {    "face_id": "118747588341006337",    "similarity": 0.4894,    "status": "UNKNOWN",    "confidence_detection": 0.9988  }}
Empty
{  "ok": false,  "code": "forbidden",  "message": "you don't have access to any streams"}

On this page