Referensi API: arsitektur, field, dan kode status

Komponen dasar yang dipakai semua operasi: alur permintaan, field JSON umum, jenis template, kode status, port, dan enkripsi payload.

Arsitektur API

PropertiAPI CallbackAPI RESTful
PemrakarsaPerangkat / Biometric GatewayServer Anda
ArahPerangkat → Server AndaServer Anda → Perangkat
LatensiReal-time (milidetik)~15 detik
PemicuPeristiwa biometrik di perangkatHTTP POST dari kode Anda
Peran AndaMenerima & mengonfirmasiMengirim perintah & polling/menunggu respons
Body respons{"status":"done"}{"Status":"done","OperationID":"…","StatusCode":0}
Perilaku offlineDi-cache oleh mesin; dikirim saat server kembali onlineDiantrekan oleh mesin; dikirim saat perangkat tersambung kembali

Field Umum

Semua permintaan — baik Callback maupun RESTful — memakai field tingkat atas berikut.

AuthTokenString. Token 32 karakter yang mengidentifikasi dan mengautentikasi permintaan dari perangkat tertentu. Dikonfigurasi di portal API Monitor. Validasi pada setiap callback masuk.
OperationIDString. Pengenal unik untuk instans operasi ini (mis. "j95xfejt3vr1"). Respons RESTful mengembalikan OperationID yang sama sehingga Anda dapat mencocokkan permintaan dengan respons.
TimeString. Stempel waktu UTC saat peristiwa diproses, dalam format YYYY-MM-DD HH:mm:ss GMT +0000. Stempel waktu lokal perangkat di dalam payload dapat memakai offset zona waktu yang berbeda.
stgid (query param)String. Service Tag ID — mengidentifikasi perangkat tujuan untuk panggilan API RESTful. Kirim sebagai query parameter URL ke endpoint yang ada di akun API Monitor Anda: POST https://<your-endpoint>?stgid=YOUR_TAG_ID.

Jenis Template

Data biometrik dan kredensial dibawa dalam array Template. Setiap item memiliki field Type:

Perilaku Penggabungan Template — Penting bagi Handler Callback
Saat data pengguna di-push dari perangkat (operasi Callback #3–#9), template dapat tiba satu per satu atau berkelompok, melalui beberapa callback. Setiap callback tidak berisi seluruh set template pengguna — hanya template yang ditambahkan atau diubah.

Server Anda harus menggabungkan template yang masuk dengan template yang sudah tersimpan untuk pengguna tersebut. Kunci unik setiap template adalah Type + Index. Contoh:
• Callback 1 tiba dengan Fingerprint Index 0 → simpan
• Callback 2 tiba dengan Face Index 0 + Card → gabungkan, jangan timpa sidik jari
• Callback 3 tiba dengan Fingerprint Index 0 (data baru) → perbarui sidik jari yang ada di Index 0
Jangan pernah mengganti semua template pada sebuah callback — selalu lakukan upsert berdasarkan Type + Index.
TipeDeskripsiField tambahan utama
CardNomor kartu RFID / proximityData (string nomor kartu)
PasswordPIN numerikData (string PIN)
FingerprintTemplate sidik jari — biner berenkode Base64Index (indeks jari 0–9), Size, Data
FaceTemplate wajah — JPEG atau biner berenkode Base64Index, Size, Data
PalmTemplate vena telapak tangan — biner berenkode Base64Index, Data
UserPhotoFoto profil pengguna — JPEG berenkode Base64Data

Kode Status Respons

Respons API RESTful menyertakan StatusCode numerik. Respons API Callback selalu memakai bentuk sederhana {"status":"done"} apa pun hasilnya.

KodeStatusDeskripsi
0BerhasilOperasi berhasil diselesaikan.
1Data Permintaan Tidak ValidBody JSON salah format atau berisi nilai yang tidak valid.
2Service Tag ID Tidak ValidQuery parameter stgid tidak cocok dengan perangkat terdaftar mana pun.
3Permintaan Tidak ValidStruktur permintaan tidak sesuai dengan format operasi yang diharapkan.
4Enkripsi Tidak ValidEnkripsi payload (AES-256) tidak dapat didekripsi. Periksa kunci enkripsi Anda.
5Perangkat OfflinePerangkat tujuan saat ini tidak terhubung ke Biometric Gateway.
6Operasi TimeoutPerangkat tidak mengonfirmasi perintah dalam batas waktu.
7Auth Token Tidak ValidAuthToken dalam permintaan tidak cocok dengan token yang dikonfigurasi pada perangkat.
8Pengguna Sudah AdaOperasi Add dicoba untuk UserID yang sudah ada di perangkat.
9Pengguna Tidak DitemukanUserID yang ditentukan tidak ada di perangkat.
10Kesalahan TemplateData template biometrik rusak atau dalam format yang tidak didukung.
11Memori Perangkat PenuhPerangkat telah mencapai kapasitas maksimum pengguna atau template.
13Kunci Keamanan Tidak ValidKunci keamanan yang dikonfigurasi di API Monitor tidak cocok.
15Fitur Tidak DidukungOperasi yang diminta tidak didukung oleh model perangkat atau mode komunikasi ini.
999Kesalahan Tidak DikenalTerjadi kesalahan yang tidak terduga. Hubungi dukungan Cams dengan menyertakan OperationID.

Port yang Didukung

Untuk menerima informasi absensi real-time, server Anda harus menyediakan endpoint HTTP(S) yang dapat dijangkau oleh Cams Protocol Engine.

PortProtokolPenggunaan
80HTTPProduksi. Ikatkan callback URL Anda ke port 80. Dikonfigurasi di API Monitor dan dipanggil otomatis saat absensi.
443HTTPSProduksi (aman). HTTPS dengan sertifikat SSL yang valid. Disarankan untuk produksi.
8123HTTPHanya untuk pengujian. Port non-standar yang tersedia sementara selama pengembangan.
HTTPS disarankan. Gunakan HTTPS dengan sertifikat SSL yang valid untuk produksi. Pastikan pembaruan otomatis tanpa restart server.

Data Contoh

Contoh payload permintaan dan respons untuk semua 38 operasi didokumentasikan di atas pada setiap bagian operasi. Untuk tampilan gabungan:

Halaman iniSetiap bagian operasi di atas menyertakan JSON permintaan dan respons siap salin beserta data contoh.
Halaman contoh lamabiometric-web-api-sample-request-response.html — pemilih dropdown untuk setiap operasi.

Enkripsi

Enkripsi AES-256 opsional dapat diaktifkan untuk semua data yang dipertukarkan antara Cams Protocol Engine dan server Anda.

AlgoritmaAES-256 dalam mode ECB dengan padding PKCS5 (AES/ECB/PKCS5PADDING).
Konfigurasi kunciAtur kunci Anda sebagai Security Key di API Monitor. Setelah dikonfigurasi, semua payload JSON mentah dienkripsi.
PengodeanPayload terenkripsi dienkode Base64 agar aman untuk transportasi HTTP.

Contoh Java

Enkripsi / Dekripsi (Java)
// Encryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec keySpec = new SecretKeySpec(securityKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
String encrypted = Base64.getEncoder().encodeToString(cipher.doFinal(rawJson.getBytes("UTF-8")));

// Decryption
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decoded = Base64.getDecoder().decode(encryptedPayload);
String decrypted = new String(cipher.doFinal(decoded), "UTF-8");
Penting: Saat enkripsi diaktifkan, dekripsi payload Callback masuk dan enkripsi body permintaan RESTful keluar menggunakan kunci yang sama.