API Reference — Otentikasi
Endpoint login JWT, logout, dan manajemen API key (x-api-key) tingkat pengguna.
← Kembali ke Otentikasi
Panduan JWT, API key, dan header federation untuk integrasi.
Memulai
Panduan pertama kali menggunakan Lenz Dashboard.
Endpoint Login (POST /api/auth/token) tidak memerlukan header Authorization — Anda belum memiliki token saat memanggil endpoint ini. Semua endpoint lain, termasuk logout dan seluruh manajemen API key, memerlukan header Authorization: Bearer <token>. Basis URL mengikuti variabel lingkungan VITE_API_URL yang dikonfigurasi pada instalasi Lenz.
Login & Token
Endpoint untuk memperoleh token akses (access_token) dan mengakhiri sesi. Login mendukung dua metode: username/password via JSON body, atau API key via header X-Api-Key — keduanya mengarah ke endpoint yang sama dan mengembalikan format respons yang identik.
Header Parameters
API key yang valid (untuk metode login via API key — abaikan jika menggunakan username/password)
Request Body
application/json
Kredensial login (wajib untuk metode username/password; abaikan untuk metode API key)
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
curl -X POST "https://lenz.example.com/api/auth/token" \ -H "Content-Type: application/json" \ -d '{ "user_access": "[email protected]", "password": "rahasia123" }'{ "ok": true, "message": "success", "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20iLCJpYXQiOjE3NDYwMDAwMDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsInR5cGUiOiJyZWZyZXNoIiwiaWF0IjoxNzQ2MDAwMDAwfQ.abc123def456ghi789", "name": "Siti Rahayu"}{ "ok": false, "message": "invalid request"}curl -X POST "https://lenz.example.com/api/auth/logout"{ "success": true, "message": "logout successful"}API Keys
Endpoint untuk mengelola API key tingkat pengguna. API key berguna untuk integrasi service-to-service, skrip otomatis, dan CI/CD pipeline. Setelah API key dibuat atau diperbarui, nilai key rahasia hanya dikembalikan satu kali pada respons — simpan segera.
Jangan menyimpan nilai API key di source code atau commit ke repository publik. Gunakan environment variable, secret manager (seperti Vault atau AWS Secrets Manager), atau file .env yang masuk ke dalam .gitignore.
Authorization
bearerAuth In: header
Query Parameters
Nomor halaman, dimulai dari 1
1Jumlah data per halaman
20Pencarian berdasarkan nama API key
Filter berdasarkan status API key
"active" | "inactive"Response Body
application/json
curl -X GET "https://lenz.example.com/api/api-keys"{ "ok": true, "message": "success", "results": { "limit": 20, "current_page": 1, "total_data": 2, "total_page": 1, "api_keys": [ { "id": 7, "user_id": 42, "name": "Integrasi CCTV Gedung A", "status": "active", "last_used_at": "2026-04-28T08:30:00Z", "expires_at": "2027-04-30T00:00:00Z", "created_by": 1, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-04-01T09:00:00Z", "username": "siti.rahayu", "email": "[email protected]" } ] }}Authorization
bearerAuth In: header
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/api-keys" \ -H "Content-Type: application/json" \ -d '{ "name": "Integrasi CCTV Gedung B", "expires_at": "2027-12-31T23:59:59Z" }'{ "ok": true, "message": "success", "api_key": { "id": 9, "user_id": 42, "name": "Integrasi CCTV Gedung B", "status": "active", "key": "lenz_ak_4f8e2a1b3d7c9e0f5a2b6d8c1e4f7a3b", "last_used_at": null, "expires_at": "2027-12-31T23:59:59Z", "created_by": 42, "created_at": "2026-04-30T12:00:00Z", "updated_at": "2026-04-30T12:00:00Z", "username": "siti.rahayu", "email": "[email protected]" }}Authorization
bearerAuth In: header
Path Parameters
ID numerik API key
Response Body
application/json
curl -X GET "https://lenz.example.com/api/api-keys/7"{ "ok": true, "message": "string", "api_key": { "id": 7, "user_id": 42, "name": "Integrasi CCTV Gedung A", "status": "active", "last_used_at": "2026-04-28T08:30:00Z", "expires_at": "2027-04-30T00:00:00Z", "created_by": 1, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-04-01T09:00:00Z", "username": "siti.rahayu", "email": "[email protected]" }}Authorization
bearerAuth In: header
Path Parameters
ID numerik API key
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X PUT "https://lenz.example.com/api/api-keys/7" \ -H "Content-Type: application/json" \ -d '{ "name": "Integrasi CCTV Gedung A — Diperbarui", "expires_at": "2028-01-01T00:00:00Z" }'{ "ok": true, "message": "string", "api_key": { "id": 7, "user_id": 42, "name": "Integrasi CCTV Gedung A", "status": "active", "last_used_at": "2026-04-28T08:30:00Z", "expires_at": "2027-04-30T00:00:00Z", "created_by": 1, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-04-01T09:00:00Z", "username": "siti.rahayu", "email": "[email protected]", "key": "lenz_ak_4f8e2a1b3d7c9e0f5a2b6d8c1e4f7a3b" }}Authorization
bearerAuth In: header
Path Parameters
ID numerik API key
Response Body
application/json
curl -X DELETE "https://lenz.example.com/api/api-keys/7"{ "ok": true, "message": "success"}Federation Headers
Dalam arsitektur multi-instance Lenz, header X-User-Permissions digunakan oleh Federer (Core) saat meneruskan request pengguna ke node Remote (Raisa Gateway) — bukan oleh integrator eksternal. Tidak ada endpoint khusus untuk alur ini; mekanisme ini terjadi otomatis di layer middleware Raisa Gateway.
Ketika Federer membuat request ke Remote, dua header berikut selalu disertakan bersama-sama:
| Header | Nilai | Keterangan |
|---|---|---|
X-Api-Key | API key Remote yang valid | Mengotentikasi Federer ke Remote |
X-User-Permissions | JWT bertanda tangan HMAC-SHA256 | Membawa identitas dan izin pengguna yang sudah difilter |
JWT X-User-Permissions ditandatangani menggunakan API key Remote sebagai secret, sehingga Remote dapat memvalidasi keasliannya tanpa perlu lookup ke database lokal. TTL JWT ini adalah 5 menit — Federer membuat JWT baru untuk setiap batch request.