API Reference
Referensi endpoint, skema, dan status implementasi SEMESTA ISLAM. Halaman ini mendokumentasikan sistem yang benar-benar ada, bukan kontrak yang diharapkan ada. Tidak ada eksekusi request, API key, autentikasi, atau integrasi cloud.
Overview
Semua route API dibangun di atas /app/api/v1/** dengan validasi Zod dan ditulis ke PostgreSQL 16 (Prisma 6) dalam transaksi, termasuk jejak audit (audit_logs).
- Status VERIFIED = endpoint terverifikasi secara empiris pada audit terakhir terhadap fresh database (lihat
docs/implementation/POST_EXECUTION_VERIFICATION.md). - Status selain VERIFIED menunjukkan endpoint yang terdokumentasi namun tidak berfungsi sebagai route API saat ini (deferred / aspirasional).
- Klaim autentikasi (Supabase Auth RBAC) dan rate limit (Upstash) pada
docs/07_API_ENDPOINTS.mdbersifat aspirasional; terblokir kredensial cloud. Identity saat ini diresolusi server-side (demo).
Drift kontrak yang tercatat:
- Envelope sukses tidak memuat `meta` (07 §1.1).
- Error envelope 400 memuat `details[]`; error bisnis hanya `{ success, statusCode, message }` (07 §1.2).
- `X-Verifier-Role` header (OpenAPI) vs `verifierRoles` payload (runtime) — kontradiksi tercatat di docs/audit/CONTRACT_DRIFT_REPORT.md §2.3.
- `qiraahType` semantic drift (Quran-anchored) — DECISION REQUIRED Founder.
- Auth Supabase + Upstash rate limit = aspirasional (cloud block).
- BookingInquirySchema.preferredSchedule: runtime min 3 (07 §3.2 menuliskan min 5).
API Reference
36 endpointsEducators
3 endpointDirektori pendidik, profil & sanad.
GET/api/v1/educatorsDEFERRED
Direktori Pendidik
Pencarian & filter presisi direktori pendidik (dokumentasi 07 §2.3).
Implementation Notes
- Belum ada route API. Fungsi setara disajikan sebagai halaman server-rendered `/directory` yang dibackend Postgres (terverifikasi).
- Klaim cache Upstash pada 07 bersifat aspirasional.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.3docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V6)GET/api/v1/educators/:idDEFERRED
Detail Pendidik
Detail profil pendidik, silsilah sanad, & ulasan (dokumentasi 07 §2.3).
Implementation Notes
- Belum ada route API. Fungsi setara disajikan sebagai halaman server-rendered `/educator/[id]` (DB-backed); ID tidak valid -> 404 via notFound().
Source / Evidence
docs/07_API_ENDPOINTS.md §2.3docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V6)GET/api/v1/educators/:id/reviewsDEFERRED
Ulasan Pendidik
Daftar ulasan terverifikasi (dokumentasi 07 §2.3).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.3docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)Verification
5 endpointPipeline verifikasi kredensial & sanad 4-lapis.
POST/api/v1/verification/submitVERIFIED
Submit Verifikasi Kredensial
Mengajukan verifikasi kredensial & sanad pendidik ke antrean Lajnah (status -> SUBMITTED).
RequestZod: VerificationSubmitSchema
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| educatorId | uuid | Ya | ID pendidik |
| ktpNumber | string (16 digit) | Ya | Nomor KTP |
| ktpDocumentUrl | url | Ya | URL dokumen KTP (Lapisan 1) |
| ijazahDocumentUrl | url | Ya | URL dokumen Ijazah (Lapisan 2) |
| ijazahSha256Hash | string (64 hex) | Ya | Fingerprint SHA-256 dokumen Ijazah |
| recommenderEmail | Ya | Email ulama/penyandang rekomendasi (Lapisan 3) | |
| recommenderInstitution | string (min 3) | Ya | Lembaga pemberi rekomendasi |
| qiraahSanadName | string | Opsional | Nama sanad qiraah (opsional) |
Response — 201
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| verificationRequestId | uuid | Ya | ID permohonan baru |
| educatorId | uuid | Ya | ID pendidik |
| status | "SUBMITTED" | Ya | Status awal antrean |
| ijazahSha256Hash | string (64 hex) | Ya | Fingerprint tersimpan |
| recommenderEmail | Ya | Email rekomendasi | |
| auditLogged | boolean | Ya | Selalu true; audit ditulis di transaksi |
| submittedAt | ISO 8601 | Ya | Waktu pengajuan |
Known Status / Error Codes
Implementation Notes
- Security: `ijazahSha256Hash` diperiksa ulang format 64-hex sebelum diproses.
- Menulis `verification_requests`, memperbarui `educator_profiles.verifiedStatus`, dan menulis `audit_logs` (VERIFICATION_SUBMITTED) dalam satu transaksi.
Source / Evidence
docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V7-V13) — diverifikasi ulang pada fresh database.src/app/api/v1/verification/submit/route.tssrc/lib/verification/service.tsGET/api/v1/verification/statusVERIFIED
Status Verifikasi Pendidik
Membaca status antrean verifikasi terbaru untuk seorang pendidik.
RequestZod: VerificationStatusQuery
Query Parameters
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| educatorId | uuid | Ya | Query parameter; ID pendidik |
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| requestId | uuid | Ya | ID permohonan |
| educatorId | uuid | Ya | ID pendidik |
| status | enum(VerificationStatus) | Ya | Status terkini |
| layer1KtpUrl | url | null | Ya | URL dokumen KTP |
| layer2IjazahUrl | url | null | Ya | URL dokumen Ijazah |
| layer2Sha256Hash | string | null | Ya | Fingerprint SHA-256 |
| recommenderEmail | email | null | Ya | Email rekomendasi |
| reviewNotes | string | null | Ya | Catatan telaah Lajnah |
| ethicsScore | number | Ya | Skor etika Lapisan 4 |
| createdAt | ISO 8601 | Ya | Waktu dibuat |
| updatedAt | ISO 8601 | Ya | Waktu diperbarui |
Known Status / Error Codes
Implementation Notes
- Mengembalikan permohonan terbaru (`updatedAt` desc) untuk educatorId.
Source / Evidence
docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V7-V13) — diverifikasi ulang pada fresh database.src/app/api/v1/verification/status/route.tssrc/lib/verification/service.tsPOST/api/v1/verification/reviewVERIFIED
Telaah Lajnah
Transisi status verifikasi oleh Lajnah (guard role + state machine + stale-check currentStatus terhadap DB).
RequestZod: LajnahReviewSchema
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| verificationRequestId | string (min 1) | Ya | ID permohonan verifikasi |
| currentStatus | enum(VerificationStatus) | Ya | Status yang diklaim klien (stale-check terhadap DB) |
| targetStatus | enum(VerificationStatus) | Ya | Status tujuan |
| reviewNotes | string (min 5) | Ya | Catatan telaah |
| ethicsScore | number (0-100) | Opsional | Skor etika, default 100 |
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| verificationRequestId | uuid | Ya | ID permohonan |
| verifierUserId | uuid | Ya | ID verifikator |
| previousStatus | enum(VerificationStatus) | Ya | Status sebelum transisi |
| newStatus | enum(VerificationStatus) | Ya | Status setelah transisi |
| reviewNotes | string | Ya | Catatan telaah |
| ethicsScore | number | Ya | Skor etika |
| auditLogged | boolean | Ya | Selalu true |
| reviewedAt | ISO 8601 | Ya | Waktu telaah |
Known Status / Error Codes
Implementation Notes
- State machine: DRAFT -> [SUBMITTED] · SUBMITTED -> [UNDER_REVIEW_LAJNAH, REJECTED] · UNDER_REVIEW_LAJNAH -> [VERIFIED, REJECTED] · VERIFIED -> [REVOKED] · REJECTED -> [SUBMITTED] · REVOKED -> [SUBMITTED]
- Stale-check: DB adalah sumber kebenaran; `currentStatus` klien yang basi ditolak 409.
- Menulis `verification_requests`, `educator_profiles.verifiedStatus`, dan `audit_logs` (VERIFICATION_REVIEWED) dalam satu transaksi.
Source / Evidence
docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V7-V13) — diverifikasi ulang pada fresh database.src/app/api/v1/verification/review/route.tssrc/lib/verification/service.tssrc/lib/verification/stateMachine.tsPOST/api/v1/verification/resubmitVERIFIED
Resubmit Verifikasi
Mengajukan ulang verifikasi setelah ditolak (REJECTED -> SUBMITTED).
RequestZod: VerificationSubmitSchema (+ verificationRequestId, currentStatus)
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| verificationRequestId | uuid | Ya | ID permohonan yang akan diajukan ulang |
| currentStatus | enum(VerificationStatus) | Opsional | Status yang diklaim; default "REJECTED" |
| educatorId | uuid | Ya | ID pendidik |
| ktpNumber | string (16 digit) | Ya | Nomor KTP |
| ktpDocumentUrl | url | Ya | URL dokumen KTP (Lapisan 1) |
| ijazahDocumentUrl | url | Ya | URL dokumen Ijazah (Lapisan 2) |
| ijazahSha256Hash | string (64 hex) | Ya | Fingerprint SHA-256 dokumen Ijazah |
| recommenderEmail | Ya | Email ulama/penyandang rekomendasi (Lapisan 3) | |
| recommenderInstitution | string (min 3) | Ya | Lembaga pemberi rekomendasi |
| qiraahSanadName | string | Opsional | Nama sanad qiraah (opsional) |
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| verificationRequestId | uuid | Ya | ID permohonan |
| status | "SUBMITTED" | Ya | Status setelah resubmit |
| ijazahSha256Hash | string (64 hex) | Ya | Fingerprint baru |
| resubmittedAt | ISO 8601 | Ya | Waktu resubmit |
Known Status / Error Codes
Implementation Notes
- Hanya REJECTED -> SUBMITTED dan REVOKED -> SUBMITTED yang valid untuk resubmit (state machine).
- Menulis audit VERIFICATION_RESUBMITTED.
Source / Evidence
docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V7-V13) — diverifikasi ulang pada fresh database.src/app/api/v1/verification/resubmit/route.tssrc/lib/verification/service.tsPOST/api/v1/verification/confirm-tokenDEFERRED
Konfirmasi Token Rekomendasi
Verifikasi token rekomendasi ulama via email (dokumentasi 07 §2.5).
Implementation Notes
- Belum ada kode. Membutuhkan infrastruktur email/token yang belum tersedia; ditunda pasca-MVP.
- Tidak direpresentasikan sebagai berfungsi.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.5docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)Bookings
3 endpointBooking inquiry & konfirmasi (virtual ledger).
POST/api/v1/bookings/inquireVERIFIED
Inquiry Booking
Pengajuan multi-step booking inquiry + alokasi poin virtual ledger.
RequestZod: BookingInquirySchema
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| educatorId | uuid | Ya | ID pendidik tujuan |
| courseId | uuid | Opsional | ID program (opsional) |
| scheduleId | uuid | Opsional | ID jadwal (opsional) |
| learningMethod | enum(ONLINE_ZOOM | PRIVATE_HOME | GROUP_MAJELIS) | Ya | Metode belajar |
| preferredSchedule | string (min 3) | Ya | Preferensi jadwal |
| learnerName | string (min 2) | Ya | Nama pembelajar |
| contactPhone | string (regex ^(\+62|08)[0-9]{8,12}$) | Ya | Nomor WhatsApp/HP Indonesia |
| notes | string (max 500) | Opsional | Catatan tambahan |
Response — 201
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| bookingId | uuid | Ya | ID booking baru |
| learnerName | string | Ya | Nama pembelajar |
| learningMethod | enum(LearningMethod) | Ya | Metode belajar |
| preferredSchedule | string | Ya | Preferensi jadwal |
| ledgerPointsEarned | number | Ya | Poin yang dialokasikan (50) |
| invoiceStatus | string | Ya | Status invoice dari MockPaymentGatewayAdapter ("PAID") |
Known Status / Error Codes
Implementation Notes
- Menulis `booking_requests` (status PENDING), `economic_ledgers` (LEARNER_POINT 50), dan `audit_logs` (BOOKING_INQUIRED) dalam satu transaksi.
- Invoice dibuat via MockPaymentGatewayAdapter (pratekonfigurasi per docs); status "PAID".
- learnerUserId tidak dikirim klien; diresolusi server-side (DEMO_LEARNER_USER_ID) hingga auth nyata ada.
Source / Evidence
docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V7-V13) — diverifikasi ulang pada fresh database.src/app/api/v1/bookings/inquire/route.tssrc/lib/bookings/service.tsPOST/api/v1/bookings/confirmVERIFIED
Konfirmasi Booking
Konfirmasi booking PENDING oleh pendidik pemilik atau founder (PENDING -> CONFIRMED).
RequestZod: BookingConfirmSchema
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| bookingId | uuid | Ya | ID booking |
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| bookingId | uuid | Ya | ID booking |
| status | "CONFIRMED" | Ya | Status baru |
| confirmedAt | ISO 8601 | Ya | Waktu konfirmasi |
Known Status / Error Codes
Implementation Notes
- Domain event `booking.confirmed` (PRD §450, WEBHOOK_CONTRACT).
- Guard: hanya pemilik EDUCATOR (booking.educator.userId === actorUserId, dari session server-side — bukan dari klien) atau FOUNDER_ADMIN.
- Menulis status CONFIRMED + audit BOOKING_CONFIRMED.
Source / Evidence
docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V7-V13) — diverifikasi ulang pada fresh database.src/app/api/v1/bookings/confirm/route.tssrc/lib/bookings/service.tsGET/api/v1/bookings/ledgerDEFERRED
Riwayat Ledger
Riwayat pencatatan buku besar internal (dokumentasi 07 §2.6).
Implementation Notes
- Belum ada kode; bagian dari scope member/founder pasca-MVP.
- Tidak direpresentasikan sebagai berfungsi.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.6docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)Authentication
3 endpointAuth & sesi (aspirational — Supabase terblokir).
POST/api/v1/auth/magic-linkASPIRATIONAL
Magic Link
Mengirimkan Magic Link via Supabase Auth (dokumentasi 07 §2.1).
Implementation Notes
- Belum ada kode; terblokir kredensial cloud Supabase. Identity demo diresolusi server-side.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.1docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N2)POST/api/v1/auth/verify-sessionASPIRATIONAL
Verifikasi Sesi
Verifikasi token sesi & mengambil data role (dokumentasi 07 §2.1).
Implementation Notes
- Belum ada kode; terblokir kredensial cloud Supabase.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.1docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N2)POST/api/v1/auth/logoutASPIRATIONAL
Logout
Mengakhiri sesi pengguna (dokumentasi 07 §2.1).
Implementation Notes
- Belum ada kode; terblokir kredensial cloud Supabase.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.1docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N2)Member
2 endpointDashboard & laporan anggota.
GET/api/v1/member/dashboardDEFERRED
Dashboard Anggota
Data agregat (jadwal, point ledger, referral) — dokumentasi 07 §2.2.
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.2docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/member/progress-reportsDEFERRED
Laporan Perkembangan
Laporan perkembangan Rabbani anak (dokumentasi 07 §2.2).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.2docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)Courses / LMS
5 endpointKatalog program & modul LMS.
GET/api/v1/coursesDEFERRED
Katalog Program
Katalog program belajar & kurikulum (dokumentasi 07 §2.4).
Implementation Notes
- Belum ada route API. `course_catalogs` (9 entri) sudah tersedia di database via seed.
- Fungsi katalog saat ini disajikan via halaman landing (`/`), bukan API.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.4docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)POST/api/v1/coursesDEFERRED
Buat Program
Membuat kurikulum/modul materi baru (dokumentasi 07 §2.4).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.4docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)POST/api/v1/lms/attendanceDEFERRED
Presensi Sesi
Catat presensi sesi mengajar (dokumentasi 07 §2.4).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.4docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)POST/api/v1/lms/progress-reportDEFERRED
Laporan Perkembangan
Laporan perkembangan hafalan/talaqqi (dokumentasi 07 §2.4).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.4docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/lms/external-ssoDEFERRED
SSO LMS Eksternal
SSO Token ke LearnHouse / Moodle LMS (dokumentasi 07 §2.4).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.4docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)Referrals
3 endpointKode referral, statistik & leaderboard.
POST/api/v1/referrals/generate-codeDEFERRED
Generate Kode Referral
Membuat kode/link referral baru (dokumentasi 07 §2.7).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.7docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/referrals/statsDEFERRED
Statistik Referral
Statistik klik, konversi, & komisi virtual (dokumentasi 07 §2.7).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.7docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/referrals/leaderboardDEFERRED
Leaderboard Ambassador
Papan peringkat ambassador terbanyak (dokumentasi 07 §2.7).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.7docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)Management
8 endpointCMS, ERP, RBAC, taksonomi & queue.
GET/api/v1/management/cms/articlesDEFERRED
Manajemen CMS
Manajemen konten artikel & landing page (dokumentasi 07 §2.8).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.8docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/management/erp/ledger-summaryDEFERRED
Ringkasan Ledger ERP
Pengawasan pembukuan ledger & fee platform (dokumentasi 07 §2.8).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.8docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/management/rbac/rolesDEFERRED
Matriks RBAC
Manajemen matriks hak akses user (dokumentasi 07 §2.8).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.8docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/management/verification/queueDEFERRED
Queue Verifikasi (API)
Queue audit 4-lapis Lajnah & approval badge (dokumentasi 07 §2.8).
Implementation Notes
- Belum ada route API. Fungsi setara disajikan sebagai halaman server-rendered `/management/lajnah` (listVerificationQueue, DB-backed; terverifikasi).
Source / Evidence
docs/07_API_ENDPOINTS.md §2.8docs/implementation/POST_EXECUTION_VERIFICATION.md §1 (V12)GET/api/v1/management/taxonomyDEFERRED
Tata Kelola Taksonomi
Hirarki kategori, Mazhab, Sanad Tree (dokumentasi 07 §2.8).
Implementation Notes
- Belum ada kode; pasca-MVP.
Source / Evidence
docs/07_API_ENDPOINTS.md §2.8docs/implementation/POST_EXECUTION_VERIFICATION.md §2 (N4)GET/api/v1/management/economy/overviewVERIFIED
Overview Ekonomi (Founder)
Monitoring Founder: total transaksi, ledger, poin beredar, payment health, komisi.
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| overview.transactionCount | int | Ya | Total transaksi |
| overview.totalPointsInCirculation | int | Ya | Poin beredar (proyeksi) |
| payment.mode | string | Ya | 'SIMULATED_INTERNAL' |
Known Status / Error Codes
Implementation Notes
- Runtime: founder 200, staff 403.
Source / Evidence
src/app/api/v1/management/economy/overview/route.tsPOST/api/v1/management/economy/adjustmentsVERIFIED
Penyesuaian Ekonomi (Founder)
ADJUSTMENT founder dengan reason wajib + authorization + audit (economy.adjust).
RequestZod: AdjustmentSchema
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| accountOwnerId | uuid | Ya | Target akun |
| amount | int | Ya | Jumlah (signed, integer) |
| reason | string | Ya | Alasan wajib |
Response — 201
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| transactionId | uuid | Ya | ADJUSTMENT transaction |
| status | string | Ya | 'COMPLETED' |
| duplicate | boolean | Ya | Idempotency indicator |
Known Status / Error Codes
Implementation Notes
- Runtime: founder 201 COMPLETED, staff 403. Idempotent per key.
Source / Evidence
src/app/api/v1/management/economy/adjustments/route.tssrc/lib/economy/service.tsPOST/api/v1/management/economy/reversalsVERIFIED
Reversal Transaksi (Founder)
REVERSAL transaksi COMPLETED dengan reason wajib + audit (economy.reversal).
RequestZod: ReversalSchema
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| transactionId | uuid | Ya | Transaksi target (COMPLETED) |
| reason | string | Ya | Alasan wajib |
Response — 201
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| transactionId | uuid | Ya | Transaksi asli (REVERSED) |
| reversalTransactionId | uuid | Ya | Transaksi REVERSAL baru |
| status | string | Ya | 'REVERSED' |
Known Status / Error Codes
Implementation Notes
- Runtime: founder 201 REVERSED, duplicate deterministic reject, staff 403.
Source / Evidence
src/app/api/v1/management/economy/reversals/route.tssrc/lib/economy/service.tsEconomy
3 endpointInternal economy: balance, transaksi, ledger.
GET/api/v1/economy/balanceVERIFIED
Balance Proyeksi (Poin Saya)
Proyeksi saldo Poin dari ledger append-only (SELF-scoped).
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| accountOwnerId | uuid | Ya | Akun yang diproyeksikan |
| currency | string | Ya | 'POINT' |
| balance.totalPoints | int | Ya | Saldo Poin (proyeksi ledger) |
Menyertakan disclaimer: Poin internal platform — non-tunai dan tidak dapat ditarik.
Known Status / Error Codes
Implementation Notes
- Ledger adalah sumber kebenaran; saldo adalah proyeksi. Runtime: learner 200, unauth 401.
Source / Evidence
src/app/api/v1/economy/balance/route.tssrc/lib/ledger/service.tsGET/api/v1/economy/transactionsVERIFIED
Transaksi Ekonomi
Riwayat transaksi (SELF default; ?organizationId org-scoped untuk ORG_OWNER/ADMIN).
Request
Query Parameters
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| organizationId | uuid | Opsional | Scope organisasi (org-scoped read) |
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| scope | string | Ya | 'SELF' | 'ORGANIZATION' |
| transactions | array | Ya | Daftar EconomicTransaction |
Known Status / Error Codes
Implementation Notes
- Runtime: learner SELF 200, cross-org 403, org admin org-scoped 200.
Source / Evidence
src/app/api/v1/economy/transactions/route.tssrc/lib/economy/service.tsGET/api/v1/economy/ledgerVERIFIED
Entri Ledger (SELF)
Entri ledger append-only milik member yang terautentikasi.
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| accountOwnerId | uuid | Ya | Pemilik ledger |
| entries | array | Ya | Entri append-only |
Known Status / Error Codes
Implementation Notes
- Runtime: learner 200 (2 entries).
Source / Evidence
src/app/api/v1/economy/ledger/route.tsPayments
1 endpointExternal payment boundary (webhook mock).
POST/api/v1/payments/webhookVERIFIED
Webhook Pembayaran (Mock)
Webhook provider mock: verifikasi HMAC signature + idempotent; PAID → domain transaction.
RequestZod: WebhookPayload
Request Body
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| eventId | string | Ya | ID event unik (idempotency) |
| bookingId | uuid | Ya | Booking terkait |
| amount | int | Ya | Jumlah |
| status | string | Ya | 'PAID' | 'REFUNDED' | 'EXPIRED' | 'FAILED' |
Response — 200
Envelope sukses runtime: `{ "success": true, "statusCode": <code>, "message": "...", "data": { ... } }`. Field `meta` (07_API_ENDPOINTS.md §1.1) tidak dikeluarkan oleh runtime saat ini (drift tercatat).
| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| paymentId | uuid | Ya | Payment boundary record |
| paymentStatus | string | Ya | 'PAID' |
| transactionId | uuid | null | Ya | Domain transaction (PAID only) |
| duplicate | boolean | Ya | Duplicate webhook indicator |
| mode | string | Ya | 'SIMULATED_INTERNAL' |
Known Status / Error Codes
Implementation Notes
- Runtime: valid 200, duplicate dup:true (satu efek), forged 401, tanpa persistensi.
Source / Evidence
src/app/api/v1/payments/webhook/route.tssrc/lib/payment/service.tssrc/lib/payment/mockAdapter.tsSchemas
Zod Validation Schemas
BookingInquirySchema
src/lib/validations/index.ts| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| educatorId | uuid | Ya | ID pendidik tujuan |
| courseId | uuid | Opsional | ID program (opsional) |
| scheduleId | uuid | Opsional | ID jadwal (opsional) |
| learningMethod | enum(ONLINE_ZOOM | PRIVATE_HOME | GROUP_MAJELIS) | Ya | Metode belajar |
| preferredSchedule | string (min 3) | Ya | Preferensi jadwal |
| learnerName | string (min 2) | Ya | Nama pembelajar |
| contactPhone | string (regex ^(\+62|08)[0-9]{8,12}$) | Ya | Nomor WhatsApp/HP Indonesia |
| notes | string (max 500) | Opsional | Catatan tambahan |
VerificationSubmitSchema
src/lib/validations/index.ts| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| educatorId | uuid | Ya | ID pendidik |
| ktpNumber | string (16 digit) | Ya | Nomor KTP |
| ktpDocumentUrl | url | Ya | URL dokumen KTP (Lapisan 1) |
| ijazahDocumentUrl | url | Ya | URL dokumen Ijazah (Lapisan 2) |
| ijazahSha256Hash | string (64 hex) | Ya | Fingerprint SHA-256 dokumen Ijazah |
| recommenderEmail | Ya | Email ulama/penyandang rekomendasi (Lapisan 3) | |
| recommenderInstitution | string (min 3) | Ya | Lembaga pemberi rekomendasi |
| qiraahSanadName | string | Opsional | Nama sanad qiraah (opsional) |
LajnahReviewSchema
src/app/api/v1/verification/review/route.ts (inline)| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| verificationRequestId | string (min 1) | Ya | ID permohonan verifikasi |
| currentStatus | enum(VerificationStatus) | Ya | Status yang diklaim klien (stale-check terhadap DB) |
| targetStatus | enum(VerificationStatus) | Ya | Status tujuan |
| reviewNotes | string (min 5) | Ya | Catatan telaah |
| ethicsScore | number (0-100) | Opsional | Skor etika, default 100 |
Identity verifikator (verifierUserId & verifierRoles) TIDAK dikirim klien; diresolusi server-side dari session (DECISION-07) dan diperiksa role LAJNAH_VERIFIER/FOUNDER_ADMIN.
BookingConfirmSchema
src/app/api/v1/bookings/confirm/route.ts (inline)| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| bookingId | uuid | Ya | ID booking |
Identity aktor (actorUserId & actorRoles) TIDAK dikirim klien; diresolusi server-side dari session (DECISION-07). Konfirmasi hanya untuk pendidik pemilik booking atau FOUNDER_ADMIN.
VerificationStatusQuery
src/app/api/v1/verification/status/route.ts (inline)| Field | Type | Wajib | Deskripsi |
|---|---|---|---|
| educatorId | uuid | Ya | Query parameter; ID pendidik |
State Machine — Verification
Domain Enums
UserRole
VerificationStatus
LearningMethod
BookingStatus
LedgerEntryType
Implementation Status
Status Legend
Endpoint ada di kode dan terverifikasi secara empiris pada audit terbaru (E2E, fresh database).
Endpoint ada di kode, terverifikasi dari sumber; belum masuk daftar verifikasi E2E terakhir.
Terdokumentasi di 07_API_ENDPOINTS.md, sengaja ditunda pasca-MVP; belum ada kode.
Kapabilitas yang diharapkan kontrak (contoh: Supabase Auth, Upstash rate limit) — terblokir kredensial cloud, belum ada kode.
Terdokumentasi, belum ada kode, dan tidak terjadwal pada MVP.
Endpoint Matrix (13 verified · 20 deferred · 3 aspirational)
Non-Endpoint Capabilities (Aspirational)
Supabase Auth & RBAC
ASPIRATIONALdocs/07_API_ENDPOINTS.md §1Proteksi route API via Supabase Auth RBAC.
Runtime: Belum ada. Role diresolusi server-side (DEMO_LEARNER_USER_ID, DEMO_EDUCATOR_ID, LAJNAH verifier) hingga kredensial cloud tersedia.
Upstash Redis Rate Limiter
ASPIRATIONALdocs/07_API_ENDPOINTS.md §4Rate limit per IP / user (60/menit public, 5/menit verification, 3/menit auth).
Runtime: Belum ada middleware rate limit; terblokir kredensial cloud Upstash.