Referensi Developer E-Pondok
Sisi teknis E-Pondok mencakup konsep, model data, alur kerja check-in wajah, keamanan internal, arsitektur, dan HTTP API lengkap. Untuk penyiapan produk langkah demi langkah, lihat Panduan Setup.
Pengenalan
E-Pondok adalah sistem kehadiran & relasi untuk pondok modern. Kamera browser di gerbang mencatat siapa yang datang dan pergi, buku tamu digital mengelola kunjungan, dan dashboard merangkai data itu jadi laporan serta peta relasi institusi yang hidup.
Dirancang untuk realitas pondok: dapat digunakan oleh banyak pondok (multi-tenancy) dan menjaga keamanan tanpa menambah beban operasional.
Apa yang didapat
- Kehadiran wajah tanpa sentuh dengan deteksi arah masuk/keluar otomatis, plus kios offline untuk gerbang.
- Anti-spoofing. Menolak foto, video, dan masker wajah palsu.
- Akademik: angkatan, hafalan, rapor, dan mutabaah yaumiyah dengan rekap per santri.
- Keuangan & penggajian: tagihan SPP, pembayaran QRIS/transfer, kwitansi email, payroll dari kehadiran nyata.
- Modul pondok: perpustakaan, UKS, asrama, PPDB online, tata tertib, inventaris, izin, EMIS, dan Asisten AI.
- Buku tamu digital dengan kategori, tujuan, dan kontribusi kunjungan.
- Kabar otomatis ke wali: email saat santri check-in/check-out, lengkap bukti foto.
- Dashboard ringkasan + analitik kehadiran.
- Login magic link tanpa kata sandi untuk semua pengguna.
Konsep inti
Pondok = tenan
Satu pondok adalah satu tenan (tenant) yang terisolasi. Setiap pondok mendapat subdomain sendiri, misalnya pondokabc.epondok.id. Datanya tidak pernah bercampur dengan pondok lain meski berbagi satu basis data.
Tiga permukaan (surfaces)
- Apex. Domain induk
epondok.iduntuk landing publik, pendaftaran, checkout, dan dokumentasi ini. - Platform. Subdomain
platform.epondok.iduntuk admin super yang mengelola akun, langganan, dan penyediaan pondok baru. - Tenant. Subdomain
*.epondok.iduntuk aplikasi admin setiap pondok (dashboard, kehadiran, pengunjung, dan relasi).
Peran (roles)
Person di pondok mempunyai salah satu peran berikut:
| santri | Pelajar/santri pondok |
| ustadz | Pengajar |
| staff | Staf operasional |
| pengurus | Pengurus pondok |
Peran admin di sisi aplikasi: admin (akses penuh termasuk Penggajian & Keuangan), pengurus, dan platform (super-admin di apex).
Alur cepat
Dari nol hingga kehadiran otomatis dalam lima langkah.
Panduan produk lima langkah (daftar → langganan → buat pondok → daftarkan wajah dari browser → live), dengan pratinjau langsung tiap form, kini ada di Panduan Setup. Halaman ini menyimpan referensi teknis.
Dashboard
Halaman utama tenant. Ringkasan real-time dari seluruh modul. Sumber data: GET /api/dashboard.
Kartu ringkasan
- Kehadiran. Hadir hari ini, absen, terlambat, total populasi, dan tren harian.
- Pengunjung. Kunjungan hari ini, bulan ini, dan kunjungan dosen selama 3 tahun.
- Relasi. Relasi baru, mitra aktif, potensial, strategis, dan jaringan alumni.
- Follow-up. Jumlah tindak lanjut yang jatuh tempo.
Persons & enrollmen
Person adalah setiap individu di pondok (santri, ustaz, staf, atau pengurus). Operasi CRUD tersedia melalui /api/persons.
Enrollmen wajah
Pendaftaran wajah menangkap wajah, mengubahnya menjadi embedding 512 dimensi, lalu dan disimpan sebagai template terindeks per pondok. Saat pendaftaran, opsi checkDuplicates mencegah wajah yang sama didaftarkan dua kali, sedangkan qualityScore mencatat kualitas tangkapan.
capture frame
→ pemeriksaan anti-spoofing // tolak foto/video/masker
→ embedding 512-d (InsightFace)
→ POST /api/persons/:id/enrollments
{ embedding, deviceId, qualityScore, checkDuplicates: true } -
POST /api/persons/:id/verify-face. Mencocokkan embedding baru dengan pendaftaran wajah person. -
DELETE /api/persons/:id/enrollments/:eid. Menonaktifkan pendaftaran wajah lama, bukan menghapusnya secara permanen.
Kehadiran
Inti produk. Kamera check-in — halaman Check-in web di perangkat berkamera apa pun — menangkap wajah di gerbang → mencocokkannya dengan indeks wajah pondok → mendeteksi arah masuk/keluar secara otomatis → menyimpan kejadian dengan skor kepercayaan (confidence) dan, jika ada, ID perangkat (device_id).
Query
-
GET /api/attendance. Daftar event (Paged), dengan filterpersonId,role,from, danto. -
GET /api/attendance/presence. Menampilkan siapa yang sedang berada di dalam. -
GET /api/attendance/analytics. Menyediakan data masuk/keluar harian, yang paling sering terlambat, yang paling tepat waktu, serta filter rentang waktu dan peran.
Pengunjung
Buku tamu digital. Setiap kunjungan dapat kategori, tujuan, check-in/out, dan nomor pengunjung (visitor_no).
Kategori
parent_guardianlecturerteachergovernment_officialcommunity_leaderalumnivendorgeneralother
Kontribusi kunjungan
Tiap kunjungan dapat mencatat kontribusi untuk pelaporan, seperti workshop, guest_lecture, training, mentoring, community_service, research_collaboration, recruitment_opportunity, dan other. Data yang dicatat mencakup topik, audiens, peserta, dan hasil.
Relasi institusi
Peta jejaring pondok agar tetap hidup dan terlacak.
Kontak
RelationshipContact menyimpan nama, lembaga, jabatan, keahlian, status (new / active / potential / alumni / strategic), dan catatan.
Tag kolaborasi
CollaborationTag (slug + label) dapat ditambahkan atau dihapus dari kontak untuk mengelompokkan mitra, misalnya pengajar-tamu dan beasiswa.
Follow-up
Tindak lanjut terjadwal: contact_id, due_date, assigned_to, status (open / in_progress / completed / cancelled). Filter overdue menyoroti yang sudah lewat jatuh tempo.
Modul pondok
Semua modul berikut mengikuti pola yang sama: daftar terpaginasi (Paged<T>), tulis lewat POST/PATCH, hapus lunak (trash + restore), dan ekspor CSV. Rute lengkap ada di tabel Referensi API di bawah. Modul dengan tingkat paket tertentu menolak permintaan dengan 402 payment_required bila paket pondok belum mencakupnya.
Akademik
/api/academic — angkatan (cohorts) dengan impor massal, catatan hafalan per santri, dan periode rapor.
Mutabaah Yaumiyah
/api/mutabaah — template amal harian milik pondok, entri harian per santri dengan rating, dan GET /summary untuk rekap per santri: streak berjalan, streak terpanjang, progres per amal, dan rating rata-rata.
Penggajian
/api/payroll — profil gaji staf, pembuatan run payroll per periode dari kehadiran nyata (termasuk potongan keterlambatan), lalu kunci & kirim slip via email.
Kabar wali
/api/notifications — pengaturan email otomatis saat santri check-in/check-out (opsional dengan bukti foto), kanal Email/WhatsApp/Telegram, dan log pengiriman berisi status tiap notifikasi.
Perpustakaan
/api/perpustakaan — katalog buku, eksemplar per kode, peminjaman dengan jatuh tempo + pengingat email, dan reservasi.
Kesehatan (UKS)
/api/kesehatan — kunjungan klinik (keluhan → diagnosis → tindakan), pemberian obat, insiden, dan imunisasi.
Asrama
/api/asrama — gedung → kamar → ranjang, penempatan santri, dan gate pass izin keluar/pulang dengan persetujuan.
PPDB
/api/ppdb — formulir pendaftaran publik di subdomain pondok, verifikasi pendaftar, terima (otomatis jadi santri + tagihan uang masuk), dan pengaturan periode.
Keuangan
/api/finance — item biaya, tagihan per periode (dibuat otomatis per angkatan), pembayaran multi metode dengan kwitansi email, rekap tunggakan, dan pengingat pembayaran.
Tata tertib
/api/tata-tertib — katalog pasal berpoin, pencatatan pelanggaran, poin kumulatif per santri, dan sanksi bertahap.
Inventaris
/api/inventaris — aset dengan kondisi/lokasi/nilai, peminjaman barang, dan log mutasi.
Keperizinan
/api/keperizinan — izin pulang/keluar/sakit dengan alur ajukan → setuju/tolak → catat kembali, plus kabar ke wali.
EMIS
/api/emis — cek kelengkapan data santri untuk pelaporan EMIS Pesantren (hanya penanda, tanpa nilai NIK/NISN), ekspor CSV dengan urutan kolom terdokumentasi, dan /api/emis/santri/rows (JSON, memuat NIK; khusus admin/pengurus) yang dipakai dashboard untuk membuat ekspor .xlsx dan mengisi template EMIS yang diunggah — di browser.
Asisten AI
/api/asisten — ringkasan anomali santri dari data kehadiran/hafalan/UKS (/brief), dan Tanya Kitab di /api/asisten/kitab: unggah dan kelola korpus kitab, lalu tanya jawab dengan rujukan (jawaban mengalir lewat SSE).
Perangkat
API manajemen perangkat untuk klien perangkat keras. Saat ini kehadiran berjalan web-first, sehingga halaman Perangkat disembunyikan dari aplikasi admin dan pemakaian harian tidak memerlukan registrasi perangkat. Setiap kios yang didaftarkan punya identitas unik dan kuncinya sendiri; setiap permintaan sinkronisasi diverifikasi sebelum diproses, dan kios yang dicabut langsung ditolak.
-
POST /api/devices/register. Mendaftarkan kios baru. -
POST /api/devices/:id/revoke. Mencabut akses sehingga kios tidak dapat melakukan sinkronisasi. -
POST /api/devices/:id/activate. Mengaktifkan kios kembali. -
last_seen_atmelacak sinkronisasi terakhir.
device_uid unik lintas seluruh pondok (bukan per-pondok). Jangan gunakan UID yang sama untuk dua kios.
Admin platform
Permukaan platform (platform.epondok.id) adalah ruang super-admin untuk menyediakan pondok baru, mengelola langganan, dan mengubah status pondok (active / suspended). Token platform terpisah dari token tenant karena keduanya menggunakan origin yang berbeda.
Multi-pondok
Satu sistem, banyak pondok. Setiap pondok mendapat subdomain & data terisolasi. Secara teknis: kolom pondok_id pada semua tabel tenan, resolver subdomain→pondok, dan JWT membawa pondokId sehingga setiap query terbatas pada pondok pemilik token.
Login magic-link
Login tanpa kata sandi: minta tautan melalui email, lalu klik untuk masuk. Tautan hanya berlaku sekali dan kedaluwarsa cepat. Kata sandi tetap tersedia sebagai metode cadangan untuk admin platform.
Isolasi tenan
Isolasi pondok dijaga berlapis: subdomain → pondok (resolver), pondok_id pada tiap baris, dan pondokId di JWT. Tidak ada titik akhir tenant yang bisa membaca data pondok lain. Semua lalu lintas terenkripsi saat transit (TLS).
Keamanan & privasi data
Data pondok adalah amanah. Beberapa prinsip yang kami jaga:
- Isolasi antar-pondok. Data pondok Anda tidak pernah terbaca oleh pondok lain — dijaga berlapis di tingkat akses, bukan sekadar tampilan.
- Enkripsi saat transit. Semua lalu lintas berjalan di atas TLS.
- Wajah = template, bukan foto. Yang disimpan adalah template matematis 512 dimensi yang tidak bisa dibalik menjadi gambar wajah. Template bersifat per-pondok dan dapat dinonaktifkan kapan saja.
- Anti-spoofing. Frame diperiksa oleh model anti-spoofing sebelum diproses; foto, video, dan masker wajah palsu ditolak.
- Pemrosesan wajah di perangkat. Deteksi dan pembuatan template berjalan lokal di browser/perangkat gerbang — gambar mentah tidak dibagikan ke pihak lain.
- Hapus lunak + arsip. Data yang dihapus bisa dipulihkan selama masa sampah, lalu hilang dari semua daftar.
- Data sensitif tidak keluar pondok. NIK dan NISN hanya ada di unduhan EMIS admin/pengurus dan tidak pernah dikirim ke Kemenag atau pihak ketiga; template EMIS yang diunggah diisi di browser, bukan di server kami.
Anti-spoofing wajah
Sebelum template wajah dibuat, frame diperiksa oleh model anti-spoofing untuk membedakan wajah asli dari foto, video, atau masker. Hanya wajah asli yang diproses lebih lanjut. Pemeriksaan ini berjalan di perangkat gerbang (web maupun kios) tanpa mengirim gambar ke pihak ketiga.
Model data
Entitas inti dan field pentingnya:
| Entitas | Field penting |
|---|---|
| Person | id, full_name, role, phone, active |
| EnrollmentRow | person_id, device_id, quality_score, active |
| AttendanceEvent | person_id, ts, event_type(entry/exit), confidence, device_id |
| Visitor | visitor_no, name, category, purpose, arrival_ts, departure_ts |
| VisitContribution | type, topic, audience, participants, outcomes |
| RelationshipContact | name, institution, status, tags |
| CollaborationTag | slug, label |
| FollowUp | contact_id, due_date, assigned_to, status |
| Device | device_uid, public_key, status, bound_network, last_seen_at |
| Pondok | id, slug, name, status |
| MutabaahEntry | person_id, template_id, entry_date, rating |
| Invoice | number, person_id, amount, period, status |
| PayrollRun | period, status(draft/locked), gross, deduction, net |
| Book | title, author, type, copies(code, condition) |
| ClinicVisit | person_id, complaint, diagnosis, severity, outcome |
| GatePass | person_id, type, out_at, expected_return_at, status |
| Applicant | full_name, nisn, school_origin, status |
| Asset | name, category, condition, location, status |
| Violation | person_id, code, points, occurred_at |
| LeaveRequest | person_id, type, from_date, to_date, status |
Semua entitas tenan juga membawa pondok_id untuk isolasi.
Referensi API
API JSON di balik aplikasi. Semua rute daftar mengembalikan amplop terpaginasi:
Autentikasi integrasi
Selain token sesi admin, integrasi programatis dapat memakai kunci API: buat dari menu Pengaturan → Kunci API, lalu kirim header X-API-Key: pk_live_… pada setiap permintaan ke subdomain pondok. Kunci hanya ditampilkan sekali saat dibuat dan dapat dicabut kapan saja. Modul tertentu memerlukan paket tertentu — permintaan di luar paket mendapat 402 payment_required.
{
"items": T[],
"total": number,
"limit": number,
"offset": number
} Contoh request dengan token:
curl -H "Authorization: Bearer [REDACTED:Authorization header] header] \
"https://pondokabc.epondok.id/api/attendance?from=2026-01-01&limit=50" Rute tenant
Autentikasi
/api/auth/loginPhone + password → { token, user }/api/auth/magic/requestSend a magic-link to email/api/auth/magic/verifyExchange magic-link token → { token, user }/api/auth/meCurrent admin sessionDashboard
/api/dashboardAttendance, visitor, relation, follow-up summaryPondok (publik)
/api/pondoksPondok list for the landing directoryPersons
/api/personsList (Paged<Person>) — role, active, q/api/persons/:idPerson detail/api/personsCreate person (full_name, role, phone)/api/persons/:idUpdate/api/persons/:idDelete (soft delete)Enrollmen wajah
/api/persons/:id/enrollmentsPerson's enrollment history/api/persons/:id/enrollmentsEnroll embedding (+ deviceId, qualityScore, checkDuplicates)/api/persons/:id/enrollments/:eidDeactivate enrollment/api/persons/:id/verify-faceMatch embedding vs person's enrollmentsKehadiran
/api/attendanceEvent list (Paged) — personId, role, from, to/api/attendance/presenceWho is currently inside/api/attendance/analyticsWindow analytics — daily, top late, most punctualPengunjung
/api/visitorsList (Paged) — category, from, to, open, q/api/visitors/:idVisit detail/api/visitorsCheck-in (name, phone, category, purpose, …)/api/visitors/:id/checkoutCheck-out/api/visitors/:id/contributionsVisit contributions/api/visitors/:id/contributionsRecord contribution (type, topic)Relasi
/api/contactsContact list (Paged) — q, status, institution, tag/api/contacts/:idContact detail/api/contactsCreate contact (name, phone)/api/contacts/:idUpdate/api/contacts/:id/tagsAttach tag (slug)/api/contacts/:id/tags/:slugDetach tag/api/contacts/:id/follow-upsContact follow-upsFollow-up
/api/follow-upsList (Paged) — status, overdue/api/follow-upsCreate (contact_id, due_date, assigned_to)/api/follow-ups/:idUpdate status / due dateTag
/api/tagsList collaboration tags/api/tagsCreate tag (slug, label)Perangkat
/api/devicesList (Paged) — q, status (admin)/api/devices/registerRegister kiosk (device_uid, public_key, bound_network)/api/devices/:id/revokeRevoke access/api/devices/:id/activateReactivateAkademik
/api/academic/cohortsCohort list (classes / halaqah)/api/academic/cohortsCreate cohort/api/academic/cohorts/importBulk-import cohort members (CSV)/api/academic/hafalanQur'an memorization records (Paged)/api/academic/hafalanRecord a memorization deposit/api/academic/rapor-periodsReport-card periods/api/academic/rapor-periodsCreate report-card periodMutaba'ah (amal harian)
/api/mutabaah/templatesDaily-deed templates (per pondok)/api/mutabaah/templatesCreate template (name, category, unit, target)/api/mutabaah/entriesDaily deed entries (Paged)/api/mutabaah/entriesRecord an entry (rating or check)/api/mutabaah/summaryPer-student report: streaks, per-deed progress, avg ratingPenggajian
/api/payroll/profilesStaff payroll profiles/api/payroll/profilesCreate payroll profile (base salary)/api/payroll/runs/generateGenerate a payroll run from real attendance (period)/api/payroll/runsPayroll runs with totals/api/payroll/runs/:id/lockLock a run and email payslipsKabar wali
/api/notifications/settingsParent notification settings/api/notifications/settingsUpdate settings (check-in/out, photo, channels)/api/notifications/logDelivery log — every notification with status/api/notifications/telegram/connectStart Telegram link flowKunci API
/api/api-keysList API keys (label, prefix, last used)/api/api-keysMint an API key (label) — shown once/api/api-keys/revokeRevoke an API keyPerpustakaan
/api/perpustakaan/booksBook catalog (Paged) — type, q/api/perpustakaan/booksCreate book (title, author, type)/api/perpustakaan/copiesAdd a physical copy (code, condition, location)/api/perpustakaan/loans/borrowLoan a copy (due date)/api/perpustakaan/loans/:id/returnReturn a loan/api/perpustakaan/reservationsReserve a bookKesehatan (UKS)
/api/kesehatan/visitsClinic visits (Paged)/api/kesehatan/visitsRecord a clinic visit (complaint → treatment)/api/kesehatan/medicationsLog medication given/api/kesehatan/incidentsRecord an incident/api/kesehatan/immunizationsRecord an immunizationAsrama
/api/asrama/buildingsDormitory buildings/api/asrama/buildingsCreate building/api/asrama/roomsCreate room (capacity)/api/asrama/bedsCreate bed/api/asrama/beds/:id/assignAssign a student to a bed/api/asrama/gate-passesCreate a gate pass (type, return time)/api/asrama/gate-passes/:id/approveApprove a gate passPPDB
/api/ppdb/applicantsApplicant list (Paged) — status, q/api/ppdb/applyPublic application (rate-limited)/api/ppdb/applicants/:id/acceptAccept → student + enrollment invoice/api/ppdb/applicants/:id/rejectReject applicant/api/ppdb/settingsEnrollment period & settingsKeuangan & tagihan
/api/finance/fee-itemsFee items (SPP, enrollment fee, …)/api/finance/fee-itemsCreate fee item (amount, recurrence)/api/finance/invoicesInvoices (Paged) — status, period/api/finance/invoicesCreate an invoice/api/finance/invoices/generateGenerate invoices for a period & cohort/api/finance/paymentsRecord a payment (method, reference)/api/finance/arrearsArrears recap per student/api/finance/dunning/runRun payment reminders (review or auto)Tata tertib
/api/tata-tertib/catalogViolation catalog (codes & default points)/api/tata-tertib/catalogAdd a violation article/api/tata-tertib/violationsRecord a violation (points, date)/api/tata-tertib/pointsCumulative points per student/api/tata-tertib/sanctionsCreate a sanction (warning → suspension)Inventaris
/api/inventaris/assetsAsset list (Paged) — category, location/api/inventaris/assetsCreate asset (condition, value)/api/inventaris/loans/borrowLoan an asset (due date)/api/inventaris/loans/:id/returnReturn an asset/api/inventaris/movementsRecord a location/status movementKeperizinan
/api/keperizinanLeave requests (Paged) — type, status/api/keperizinanCreate a leave request (type, dates, reason)/api/keperizinan/:id/approveApprove (notifies the parent)/api/keperizinan/:id/rejectReject with a note/api/keperizinan/:id/returnRecord actual return timeEMIS
/api/emis/santri/hygienePer-student data completeness flags/api/emis/santri/exportCSV in documented EMIS column order/api/emis/santri/rowsExport rows as JSON (with NIK) for the in-browser .xlsx export / template autofillAsisten AI
/api/asisten/briefAI anomaly summary (attendance, memorization, clinic)/api/asisten/kitab/corpusKitab corpus documents with ingest status/api/asisten/kitab/corpusUpload a kitab (PDF with text layer, DOCX, TXT, MD)/api/asisten/kitab/corpus/:id/processAdvance ingest by one step (extract → index)/api/asisten/kitab/corpus/:idRemove a document, its chunks, and its vectors/api/asisten/kitab/sessionsCreate a chat session (private to the caller)/api/asisten/kitab/sessions/:id/askAsk the kitab (SSE stream with cited passages)Rute platform (apex)
Platform (apex)
/api/platform/registerRegister platform account (name, email, password)/api/platform/loginPlatform login/api/platform/magic/requestPlatform magic-link/api/platform/magic/verifyVerify platform magic-link/api/platform/meCurrent platform session/api/platform/slug/checkCheck pondok slug availability/api/platform/checkoutCreate a checkout session (seats)/api/platform/pondokList pondok owned by the account/api/platform/pondokCreate a new pondok (slug, name)/api/platform/pondok/:idUpdate pondok name / statusRute kiosk & sync dipakai kios dengan tanda tangan perangkat, bukan token admin. Tidak didokumentasikan untuk pemakaian langsung.