Nodeflux Central

API Reference — Otentikasi

Endpoint login JWT, logout, dan manajemen API key (x-api-key) tingkat pengguna.

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.

POST
/api/auth/token

Header Parameters

X-Api-Key?string

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": "admin@example.com",    "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"}
POST
/api/auth/logout

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Response Body

application/json

curl -X POST "https://lenz.example.com/api/auth/logout"
{  "success": true,  "message": "logout successful"}
Empty

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.

GET
/api/api-keys

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Query Parameters

page?integer

Nomor halaman, dimulai dari 1

Default1
limit?integer

Jumlah data per halaman

Default20
search?string

Pencarian berdasarkan nama API key

filter[status]?string

Filter berdasarkan status API key

Value in"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": "siti.rahayu@example.com"      }    ]  }}
POST
/api/api-keys

Authorization

bearerAuth
AuthorizationBearer <token>

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": "siti.rahayu@example.com"  }}
GET
/api/api-keys/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer

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": "siti.rahayu@example.com"  }}
PUT
/api/api-keys/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer

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": "siti.rahayu@example.com",    "key": "lenz_ak_4f8e2a1b3d7c9e0f5a2b6d8c1e4f7a3b"  }}
DELETE
/api/api-keys/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer

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:

HeaderNilaiKeterangan
X-Api-KeyAPI key Remote yang validMengotentikasi Federer ke Remote
X-User-PermissionsJWT bertanda tangan HMAC-SHA256Membawa 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.

On this page