E-Pondok
← Beranda
Referensi Developer

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.id untuk landing publik, pendaftaran, checkout, dan dokumentasi ini.
  • Platform. Subdomain platform.epondok.id untuk admin super yang mengelola akun, langganan, dan penyediaan pondok baru.
  • Tenant. Subdomain *.epondok.id untuk aplikasi admin setiap pondok (dashboard, kehadiran, pengunjung, dan relasi).

Peran (roles)

Person di pondok mempunyai salah satu peran berikut:

santriPelajar/santri pondok
ustadzPengajar
staffStaf operasional
pengurusPengurus 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.

Pindah ke Panduan Setup

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.

enroll flow
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 filter personId, role, from, dan to.
  • 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_at melacak sinkronisasi terakhir.
device_uid global unik

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.

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:

EntitasField penting
Personid, full_name, role, phone, active
EnrollmentRowperson_id, device_id, quality_score, active
AttendanceEventperson_id, ts, event_type(entry/exit), confidence, device_id
Visitorvisitor_no, name, category, purpose, arrival_ts, departure_ts
VisitContributiontype, topic, audience, participants, outcomes
RelationshipContactname, institution, status, tags
CollaborationTagslug, label
FollowUpcontact_id, due_date, assigned_to, status
Devicedevice_uid, public_key, status, bound_network, last_seen_at
Pondokid, slug, name, status
MutabaahEntryperson_id, template_id, entry_date, rating
Invoicenumber, person_id, amount, period, status
PayrollRunperiod, status(draft/locked), gross, deduction, net
Booktitle, author, type, copies(code, condition)
ClinicVisitperson_id, complaint, diagnosis, severity, outcome
GatePassperson_id, type, out_at, expected_return_at, status
Applicantfull_name, nisn, school_origin, status
Assetname, category, condition, location, status
Violationperson_id, code, points, occurred_at
LeaveRequestperson_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.

Paged<T>
{
"items":  T[],
"total":  number,
"limit":  number,
"offset": number
}

Contoh request dengan token:

curl
curl -H "Authorization: Bearer [REDACTED:Authorization header] header] \
"https://pondokabc.epondok.id/api/attendance?from=2026-01-01&limit=50"

Rute tenant

Autentikasi

POST/api/auth/loginPhone + password → { token, user }
POST/api/auth/magic/requestSend a magic-link to email
POST/api/auth/magic/verifyExchange magic-link token → { token, user }
GET/api/auth/meCurrent admin session

Dashboard

GET/api/dashboardAttendance, visitor, relation, follow-up summary

Pondok (publik)

GET/api/pondoksPondok list for the landing directory

Persons

GET/api/personsList (Paged<Person>) — role, active, q
GET/api/persons/:idPerson detail
POST/api/personsCreate person (full_name, role, phone)
PATCH/api/persons/:idUpdate
DELETE/api/persons/:idDelete (soft delete)

Enrollmen wajah

GET/api/persons/:id/enrollmentsPerson's enrollment history
POST/api/persons/:id/enrollmentsEnroll embedding (+ deviceId, qualityScore, checkDuplicates)
DELETE/api/persons/:id/enrollments/:eidDeactivate enrollment
POST/api/persons/:id/verify-faceMatch embedding vs person's enrollments

Kehadiran

GET/api/attendanceEvent list (Paged) — personId, role, from, to
GET/api/attendance/presenceWho is currently inside
GET/api/attendance/analyticsWindow analytics — daily, top late, most punctual

Pengunjung

GET/api/visitorsList (Paged) — category, from, to, open, q
GET/api/visitors/:idVisit detail
POST/api/visitorsCheck-in (name, phone, category, purpose, …)
POST/api/visitors/:id/checkoutCheck-out
GET/api/visitors/:id/contributionsVisit contributions
POST/api/visitors/:id/contributionsRecord contribution (type, topic)

Relasi

GET/api/contactsContact list (Paged) — q, status, institution, tag
GET/api/contacts/:idContact detail
POST/api/contactsCreate contact (name, phone)
PATCH/api/contacts/:idUpdate
POST/api/contacts/:id/tagsAttach tag (slug)
DELETE/api/contacts/:id/tags/:slugDetach tag
GET/api/contacts/:id/follow-upsContact follow-ups

Follow-up

GET/api/follow-upsList (Paged) — status, overdue
POST/api/follow-upsCreate (contact_id, due_date, assigned_to)
PATCH/api/follow-ups/:idUpdate status / due date

Tag

GET/api/tagsList collaboration tags
POST/api/tagsCreate tag (slug, label)

Perangkat

GET/api/devicesList (Paged) — q, status (admin)
POST/api/devices/registerRegister kiosk (device_uid, public_key, bound_network)
POST/api/devices/:id/revokeRevoke access
POST/api/devices/:id/activateReactivate

Akademik

GET/api/academic/cohortsCohort list (classes / halaqah)
POST/api/academic/cohortsCreate cohort
POST/api/academic/cohorts/importBulk-import cohort members (CSV)
GET/api/academic/hafalanQur'an memorization records (Paged)
POST/api/academic/hafalanRecord a memorization deposit
GET/api/academic/rapor-periodsReport-card periods
POST/api/academic/rapor-periodsCreate report-card period

Mutaba'ah (amal harian)

GET/api/mutabaah/templatesDaily-deed templates (per pondok)
POST/api/mutabaah/templatesCreate template (name, category, unit, target)
GET/api/mutabaah/entriesDaily deed entries (Paged)
POST/api/mutabaah/entriesRecord an entry (rating or check)
GET/api/mutabaah/summaryPer-student report: streaks, per-deed progress, avg rating

Penggajian

GET/api/payroll/profilesStaff payroll profiles
POST/api/payroll/profilesCreate payroll profile (base salary)
POST/api/payroll/runs/generateGenerate a payroll run from real attendance (period)
GET/api/payroll/runsPayroll runs with totals
POST/api/payroll/runs/:id/lockLock a run and email payslips

Kabar wali

GET/api/notifications/settingsParent notification settings
PATCH/api/notifications/settingsUpdate settings (check-in/out, photo, channels)
GET/api/notifications/logDelivery log — every notification with status
POST/api/notifications/telegram/connectStart Telegram link flow

Kunci API

GET/api/api-keysList API keys (label, prefix, last used)
POST/api/api-keysMint an API key (label) — shown once
POST/api/api-keys/revokeRevoke an API key

Perpustakaan

GET/api/perpustakaan/booksBook catalog (Paged) — type, q
POST/api/perpustakaan/booksCreate book (title, author, type)
POST/api/perpustakaan/copiesAdd a physical copy (code, condition, location)
POST/api/perpustakaan/loans/borrowLoan a copy (due date)
POST/api/perpustakaan/loans/:id/returnReturn a loan
POST/api/perpustakaan/reservationsReserve a book

Kesehatan (UKS)

GET/api/kesehatan/visitsClinic visits (Paged)
POST/api/kesehatan/visitsRecord a clinic visit (complaint → treatment)
POST/api/kesehatan/medicationsLog medication given
POST/api/kesehatan/incidentsRecord an incident
POST/api/kesehatan/immunizationsRecord an immunization

Asrama

GET/api/asrama/buildingsDormitory buildings
POST/api/asrama/buildingsCreate building
POST/api/asrama/roomsCreate room (capacity)
POST/api/asrama/bedsCreate bed
POST/api/asrama/beds/:id/assignAssign a student to a bed
POST/api/asrama/gate-passesCreate a gate pass (type, return time)
POST/api/asrama/gate-passes/:id/approveApprove a gate pass

PPDB

GET/api/ppdb/applicantsApplicant list (Paged) — status, q
POST/api/ppdb/applyPublic application (rate-limited)
POST/api/ppdb/applicants/:id/acceptAccept → student + enrollment invoice
POST/api/ppdb/applicants/:id/rejectReject applicant
PUT/api/ppdb/settingsEnrollment period & settings

Keuangan & tagihan

GET/api/finance/fee-itemsFee items (SPP, enrollment fee, …)
POST/api/finance/fee-itemsCreate fee item (amount, recurrence)
GET/api/finance/invoicesInvoices (Paged) — status, period
POST/api/finance/invoicesCreate an invoice
POST/api/finance/invoices/generateGenerate invoices for a period & cohort
POST/api/finance/paymentsRecord a payment (method, reference)
GET/api/finance/arrearsArrears recap per student
POST/api/finance/dunning/runRun payment reminders (review or auto)

Tata tertib

GET/api/tata-tertib/catalogViolation catalog (codes & default points)
POST/api/tata-tertib/catalogAdd a violation article
POST/api/tata-tertib/violationsRecord a violation (points, date)
GET/api/tata-tertib/pointsCumulative points per student
POST/api/tata-tertib/sanctionsCreate a sanction (warning → suspension)

Inventaris

GET/api/inventaris/assetsAsset list (Paged) — category, location
POST/api/inventaris/assetsCreate asset (condition, value)
POST/api/inventaris/loans/borrowLoan an asset (due date)
POST/api/inventaris/loans/:id/returnReturn an asset
POST/api/inventaris/movementsRecord a location/status movement

Keperizinan

GET/api/keperizinanLeave requests (Paged) — type, status
POST/api/keperizinanCreate a leave request (type, dates, reason)
POST/api/keperizinan/:id/approveApprove (notifies the parent)
POST/api/keperizinan/:id/rejectReject with a note
POST/api/keperizinan/:id/returnRecord actual return time

EMIS

GET/api/emis/santri/hygienePer-student data completeness flags
GET/api/emis/santri/exportCSV in documented EMIS column order
GET/api/emis/santri/rowsExport rows as JSON (with NIK) for the in-browser .xlsx export / template autofill

Asisten AI

GET/api/asisten/briefAI anomaly summary (attendance, memorization, clinic)
GET/api/asisten/kitab/corpusKitab corpus documents with ingest status
POST/api/asisten/kitab/corpusUpload a kitab (PDF with text layer, DOCX, TXT, MD)
POST/api/asisten/kitab/corpus/:id/processAdvance ingest by one step (extract → index)
DELETE/api/asisten/kitab/corpus/:idRemove a document, its chunks, and its vectors
POST/api/asisten/kitab/sessionsCreate a chat session (private to the caller)
POST/api/asisten/kitab/sessions/:id/askAsk the kitab (SSE stream with cited passages)

Rute platform (apex)

Platform (apex)

Hanya admin platform. Token terpisah dari tenant — apex & subdomain adalah origin berbeda.
POST/api/platform/registerRegister platform account (name, email, password)
POST/api/platform/loginPlatform login
POST/api/platform/magic/requestPlatform magic-link
POST/api/platform/magic/verifyVerify platform magic-link
GET/api/platform/meCurrent platform session
GET/api/platform/slug/checkCheck pondok slug availability
POST/api/platform/checkoutCreate a checkout session (seats)
GET/api/platform/pondokList pondok owned by the account
POST/api/platform/pondokCreate a new pondok (slug, name)
PATCH/api/platform/pondok/:idUpdate pondok name / status
Rute device-authed

Rute kiosk & sync dipakai kios dengan tanda tangan perangkat, bukan token admin. Tidak didokumentasikan untuk pemakaian langsung.