Ringkasan & Prasyarat
Webhook lokasi memungkinkan SmartGate mengirim notifikasi otomatis dan real-time ke server
HR/payroll milik perusahaan Anda setiap kali ada peristiwa tertentu: penghuni memperbarui foto swafoto,
atau penghuni melakukan presensi masuk/keluar gerbang. Server Anda menerima data ini sebagai
HTTP POST berformat JSON, tanpa perlu polling data secara berkala ke SmartGate.
role: admin dan status keanggotaan aktif pada
lokasi tersebut yang dapat melihat dan mengubah konfigurasi webhook.https:// yang dapat diakses dari
internet dan mampu menerima body application/json lewat method POST.Mengisi Form Konfigurasi
Layar Konfigurasi Webhook terdiri dari beberapa bagian. Isi masing-masing sesuai kebutuhan integrasi dengan sistem HR/payroll Anda:
Status Webhook
Sakelar di bagian paling atas menentukan apakah pengiriman webhook aktif. Saat nonaktif, konfigurasi tetap tersimpan tetapi tidak ada event yang dikirim ke server Anda โ berguna untuk menonaktifkan sementara tanpa kehilangan pengaturan.
web-info/assets/screenshots/webhook-status.jpegURL Webhook (Endpoint)
Masukkan URL lengkap server tujuan, contoh
https://api.perusahaan.com/v1/webhook. URL wajib diawali http:// atau
https:// โ gunakan https:// untuk keamanan data di jalur pengiriman.
web-info/assets/screenshots/webhook-endpoint.jpegAutentikasi Server Pihak Ketiga
Pilih tipe autentikasi (HMAC Signature, Bearer Token,
Basic Auth, atau Custom Header) lalu isi Token / Secret Key.
Khusus tipe Custom Header, isi juga Nama Header yang diinginkan (mis.
X-Api-Key). Detail cara kerja tiap tipe ada di bagian 4.
web-info/assets/screenshots/webhook-autentikasi.jpeg
Event yang Di-subscribe
Centang event yang ingin dikirim ke server Anda. Minimal satu event harus dipilih:
- Pembaruan Foto Penghuni โ
picture.updated - Presensi Masuk Gerbang โ
presence.checkin - Presensi Keluar Gerbang โ
presence.checkout
web-info/assets/screenshots/webhook-events.jpeg| Kolom di Layar | Parameter API | Keterangan |
|---|---|---|
| Status Webhook | is_active |
true/false. Wajib diisi saat menyimpan. |
| URL Webhook | endpoint_url |
Wajib diisi, harus diawali http:// atau https://. |
| Tipe Autentikasi | auth_type |
Salah satu dari hmac, bearer, basic, custom. |
| Token / Secret Key | auth_token |
Wajib diisi saat konfigurasi pertama kali dibuat. Boleh dikosongkan saat edit untuk mempertahankan secret lama. |
| Nama Header Baru | custom_header_name |
Hanya muncul & wajib diisi jika Tipe Autentikasi = custom. Nama HTTP header
yang akan dikirim ke server Anda (mis. X-Api-Key) โ hanya huruf, angka, dan
karakter - _ . ~ dst (tanpa spasi), maksimal 100 karakter. |
| Event yang Di-subscribe | events |
Array berisi minimal 1 dari picture.updated, presence.checkin,
presence.checkout. |
Setelah semua kolom terisi, ketuk Simpan Konfigurasi. Jika ini pengisian pertama kali untuk lokasi tersebut, kolom Token / Secret Key wajib diisi.
Autentikasi & Keamanan Payload
SmartGate melampirkan header autentikasi pada setiap request webhook berdasarkan tipe yang dipilih. Server tujuan perlu memverifikasi header ini agar hanya menerima request yang sah dari SmartGate:
Tipe (auth_type) |
Header yang Dikirim | Cara Kerja |
|---|---|---|
Direkomendasikanhmac |
X-Signature: <hex> |
Signature dihitung dengan HMAC-SHA256(body_json, secret), hasil dalam format
hexadecimal huruf kecil. Server Anda menghitung ulang HMAC dari raw body yang diterima dengan
secret yang sama, lalu membandingkannya dengan header ini. |
Umumbearer |
Authorization: Bearer <secret> |
Secret dikirim apa adanya sebagai bearer token pada header Authorization. |
Perhatianbasic |
Authorization: Basic <secret> |
Secret dikirim apa adanya setelah kata Basic โ tidak di-encode
Base64 secara otomatis oleh sistem. Lihat catatan di bawah. |
Barucustom |
<nama_header>: <secret> |
Nama header bebas sesuai isian Nama Header (custom_header_name), nilainya
dari Token / Secret Key apa adanya. Cocok jika server Anda mengharuskan nama header spesifik di
luar 3 tipe di atas (mis. X-Api-Key, X-Webhook-Token). |
base64(user:password)), SmartGate mengirim isi kolom Token /
Secret Key langsung tanpa proses encoding tambahan. Jika server tujuan Anda mengharapkan format
Basic Auth standar, hitung dan masukkan sendiri hasil base64(user:password) ke dalam
kolom Token / Secret Key.
Jika kolom Token / Secret Key dibiarkan kosong (belum pernah diisi sama sekali), request webhook dikirim tanpa header autentikasi apa pun.
Uji Coba (Test) Webhook
Setelah konfigurasi disimpan, bagian Uji Coba Webhook muncul di bagian bawah layar untuk mengirim payload contoh langsung ke URL webhook tersimpan, tanpa perlu menunggu event sungguhan terjadi.
Pilih Event Pengujian & Kirim
Pilih salah satu event pada dropdown Event Pengujian
(ping, presence.checkin, presence.checkout, atau
picture.updated), lalu ketuk tombol Uji Coba.
web-info/assets/screenshots/webhook-uji-coba.jpegHasil pengujian ditampilkan dalam sebuah kartu berisi:
- Status โ "Pengujian Berhasil" (hijau) jika server tujuan membalas HTTP 2xx, atau "Pengujian Gagal" (merah) jika sebaliknya atau koneksi gagal.
- HTTP Status dan Waktu Respons (ms) dari server tujuan.
- Request Payload โ isi JSON persis yang dikirim SmartGate.
- Response Body โ isi balasan dari server tujuan, atau pesan error jika gagal terhubung.
Format Data yang Dikirim Webhook
Semua request webhook dikirim sebagai POST dengan header
Content-Type: application/json. Setiap payload selalu memuat field dasar event,
timestamp (format ISO-8601 UTC), dan location_id, ditambah field spesifik
sesuai jenis event di bawah ini.
6.1 Test Ping โ LocationWebhookService.testWebhook
Dipicu manual dari tombol Uji Coba (lihat bagian 5). Semua payload uji
coba โ apa pun event yang dipilih โ selalu memuat flag "is_test": true dan field
message, dengan data contoh (dummy). Ini adalah penanda utama untuk membedakan
pengiriman uji coba dari data sungguhan pada sistem Anda.
{
"event": "ping",
"timestamp": "2026-08-12T09:15:32Z",
"location_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"is_test": true,
"message": "Ping test payload from SmartGate Webhook Dispatcher"
}
{
"event": "picture.updated",
"timestamp": "2026-08-12T09:15:32Z",
"location_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"is_test": true,
"message": "Ping test payload from SmartGate Webhook Dispatcher",
"user_id": "64a1f2e3d4c5b6a7f8e9d0c1",
"user_name": "Test Resident",
"phone": "08123456789",
"user_code": "USR-99999",
"photo_url": "https://api.smartgate.id/internal/photos/64a1f2e3d4c5b6a7f8e9d0c1?token=test",
"approval_token": "apv_test_token",
"approval_endpoint": "https://api.smartgate.id/v1/webhooks/photo-approval/64a1f2e3d4c5b6a7f8e9d0c1/apv_test_token"
}
{
"event": "presence.checkin",
"timestamp": "2026-08-12T09:15:32Z",
"location_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"is_test": true,
"message": "Ping test payload from SmartGate Webhook Dispatcher",
"gate_id": "gate-test",
"gate_name": "Gerbang Utama Uji Coba",
"user": {
"id": "64a1f2e3d4c5b6a7f8e9d0c1",
"name": "Test Resident",
"role": "penghuni",
"unit_no": "Blok A-12"
},
"verification_tier": "verified",
"latitude": -6.2,
"longitude": 106.816666
}
6.2 Perubahan Foto โ PhotoProcessingService.notifyHrForAllLocations
Dikirim otomatis setelah seorang penghuni berhasil mengunggah/memperbarui foto swafoto master, ke
setiap lokasi aktif milik penghuni tersebut yang men-subscribe event picture.updated.
Tidak seperti payload uji coba, payload sungguhan tidak memuat field is_test
maupun message.
{
"event": "picture.updated",
"timestamp": "2026-08-12T09:15:32Z",
"location_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"user_id": "66a9b8c7d6e5f4a3b2c1d0e9",
"user_name": "Budi Santoso",
"phone": "081234567890",
"user_code": "USR-00123",
"userCode": "USR-00123",
"photo_url": "https://api.smartgate.id/api/internal/photos/66a9b8c7d6e5f4a3b2c1d0e9?token=9f3c1a7e...b21a",
"approval_token": "9f3c1a7e...b21a",
"approval_endpoint": "https://api.smartgate.id/api/v1/webhooks/photo-approval/66a9b8c7d6e5f4a3b2c1d0e9/9f3c1a7e...b21a"
}
userCode (camelCase) adalah duplikat dari user_code yang dipertahankan untuk
kompatibilitas sistem lama โ nilainya selalu identik.
Alur persetujuan foto (opsional): jika sistem HR Anda perlu menyetujui/menolak foto sebelum
dianggap resmi, unduh gambar dari photo_url (URL ini sudah memuat token akses sekali pakai
di query ?token=), lalu kirim keputusan ke approval_endpoint yang disertakan
pada payload yang sama:
{
"status": "approved",
"token": "9f3c1a7e...b21a"
}
status harus "approved" atau "rejected"; token
harus sama persis dengan approval_token yang diterima pada payload. Setiap kali foto
diperbarui, token baru dibuat dan menggantikan token sebelumnya, sehingga token lama otomatis tidak
berlaku lagi.
6.3 Presensi Masuk/Keluar โ CheckInOutService.callHrLogPresence
Dikirim secara sinkron tepat setelah presensi masuk/keluar gerbang berhasil dicatat (dan verifikasi
wajah cocok), ke lokasi terkait jika event presence.checkin/presence.checkout
di-subscribe.
{
"event": "presence.checkin",
"timestamp": "2026-08-12T08:02:11Z",
"location_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"gate_id": "66f2b3c4d5e6f7a8b9c0d1e2",
"gate_name": "Gerbang Utama",
"user": {
"id": "66a9b8c7d6e5f4a3b2c1d0e9",
"name": "Budi Santoso",
"role": "penghuni",
"unit_no": "Blok A-12"
},
"verification_tier": "verified",
"latitude": -6.200123,
"longitude": 106.816456
}
Kontrak respons yang wajib dipenuhi server Anda: berbeda dari dua event lain, hasil balasan server tujuan untuk event presensi dibaca dan disimpan kembali oleh SmartGate ke dalam riwayat aktivitas penghuni. Balas dengan salah satu bentuk berikut:
{
"success": true,
"data": {
"checkIn": 1755000131000,
"checkOut": null,
"presenceDay": "2026-08-12",
"hrEmployeeId": 4021,
"attendanceStatus": "ON_TIME"
}
}
{
"success": false,
"message": "Karyawan tidak ditemukan di sistem HR"
}
attendance yang ditandai
error: true.Pertanyaan Umum & Solusi Kendala (FAQ)
application/json,
firewall/whitelist IP memblokir server SmartGate, atau header autentikasi tidak sesuai ekspektasi
server Anda (lihat bagian 4, terutama catatan Basic Auth)."is_test": true serta message. Payload event
sungguhan (foto/presensi asli) tidak pernah menyertakan kedua field tersebut.