Ringkasan endpoint
| Kelompok | Endpoint utama |
|---|---|
| Public | POST /api/contact, POST /api/waitlist, GET /api/health |
| User login | POST /api/payments, POST /api/subscription, POST /api/profile, POST /api/profile/avatar |
| Admin | POST /api/admin/users/role |
| AI | POST /api/ai/chat, POST /api/ai/generate |
| Provider callback | POST /api/webhooks/midtrans, POST /api/webhooks/doku |
Public endpoint
POST /api/contact
POST /api/contact
| Properti | Nilai |
|---|---|
| Auth | Tidak perlu login |
| Feature gate | Contact feature harus aktif |
| Rate limit | 5 request per jam per IP |
| Tujuan | Mengirim pesan dari form kontak via Resend |
| Status | Kapan terjadi |
|---|---|
400 | Field wajib tidak lengkap atau email tidak valid |
429 | Rate limit kontak tercapai |
503 | Fitur contact belum aktif atau env belum siap |
500 | Resend gagal mengirim email |
POST /api/waitlist
POST /api/waitlist
| Properti | Nilai |
|---|---|
| Auth | Tidak perlu login |
| Feature gate | Waitlist feature harus aktif |
| Rate limit | 5 request per jam per IP |
| Tujuan | Menyimpan lead ke tabel waitlist |
| Status | Kapan terjadi |
|---|---|
400 | Email tidak valid |
409 | Email sudah pernah terdaftar |
429 | Rate limit waitlist tercapai |
503 | Fitur waitlist belum aktif atau env belum siap |
500 | Insert ke database gagal |
GET /api/health
GET /api/health
| Properti | Nilai |
|---|---|
| Auth | Tidak perlu login |
| Tujuan | Mengecek readiness fitur dan database |
- status
200dipakai saat sistem sehat untuk fitur aktif, - status
503dipakai saat ada fitur aktif yang belum siap atau check database gagal, - respons juga membawa map per fitur yang berisi
enabled,missing_env, dandisabled_by_flag.
Endpoint untuk user login
POST /api/payments
POST /api/payments
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Feature gate | Payments harus aktif dan siap |
| Rate limit | 5 request per 15 menit per user |
| Tujuan | Membuat pending payment dan sesi checkout provider |
| Status | Kapan terjadi |
|---|---|
400 | plan tidak valid atau tidak tersedia |
401 | User belum login |
429 | Rate limit payment tercapai |
503 | Payments feature belum siap atau provider belum terkonfigurasi |
500 | Gagal membuat record payment |
POST /api/subscription
POST /api/subscription
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Tujuan | Cancel atau resume subscription aktif |
cancelresume
| Status | Kapan terjadi |
|---|---|
400 | Action tidak valid |
401 | User belum login |
503 | Konfigurasi server untuk billing belum siap |
POST /api/profile
POST /api/profile
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Tujuan | Menyimpan nama lengkap dan referensi avatar profile |
| Status | Kapan terjadi |
|---|---|
400 | Body profile tidak valid |
401 | User belum login |
500 | Update profile gagal |
503 | Konfigurasi write server-side belum siap |
POST /api/profile/avatar
POST /api/profile/avatar
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Feature gate | Auth harus aktif |
| Tujuan | Membuat signed upload URL untuk avatar |
| Status | Kapan terjadi |
|---|---|
400 | Ukuran file lebih dari 2 MB atau MIME type tidak didukung |
401 | User belum login |
500 | Gagal membuat signed upload URL |
503 | Auth feature belum aktif |
Endpoint admin
POST /api/admin/users/role
POST /api/admin/users/role
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Authorization | Wajib role admin |
| Tujuan | Mengubah role user menjadi admin atau member |
| Status | Kapan terjadi |
|---|---|
400 | Body invalid atau admin mencoba menurunkan role dirinya sendiri |
401 | User belum login |
403 | User login tetapi bukan admin |
500 | Update role gagal |
503 | Fitur admin belum siap dari sisi server |
Endpoint AI
POST /api/ai/chat
POST /api/ai/chat
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Rate limit | Berdasarkan plan user, per 5 menit |
| Tujuan | Streaming chat AI |
- stream UI message response, bukan JSON biasa,
- usage dicatat setelah stream selesai.
| Status | Kapan terjadi |
|---|---|
400 | messages tidak dikirim |
401 | User belum login |
429 | Rate limit request atau monthly usage limit tercapai |
503 | Provider AI belum dikonfigurasi |
POST /api/ai/generate
POST /api/ai/generate
| Properti | Nilai |
|---|---|
| Auth | Wajib login |
| Rate limit | Berdasarkan plan user, per 5 menit |
| Tujuan | One-shot text generation |
| Status | Kapan terjadi |
|---|---|
400 | prompt tidak dikirim |
401 | User belum login |
429 | Rate limit request atau monthly usage limit tercapai |
503 | Provider AI belum dikonfigurasi |
Endpoint webhook provider
POST /api/webhooks/midtrans
POST /api/webhooks/midtrans
Gunakan endpoint ini sebagai callback dari Midtrans, bukan dari browser user.Yang diverifikasi:
order_idstatus_codegross_amountsignature_keytransaction_status
- signature invalid menghasilkan
401, - payload invalid menghasilkan
400, - payment record tidak ditemukan menghasilkan
404, - duplicate event bisa mengembalikan
{ "received": true, "duplicate": true }, - event valid akan memperbarui
payments, bisa mengaktifkansubscriptions, lalu menuliswebhook_eventsdanaudit_logs.
POST /api/webhooks/doku
POST /api/webhooks/doku
Gunakan endpoint ini sebagai callback dari Doku JOKUL, bukan dari browser user.Yang diverifikasi:
order.invoice_numberorder.amounttransaction.statustransaction.original_request_idsecurity.check_word
- signature invalid menghasilkan
401, - payload invalid menghasilkan
400, - payment record tidak ditemukan menghasilkan
404, - duplicate event bisa diidentifikasi lewat
webhook_events, - event valid memperbarui
payments, bisa mengaktifkansubscriptions, lalu menulis audit trail.
Route
/auth/confirm adalah callback auth, bukan endpoint /api. Untuk memahami perannya dalam login, OTP, dan OAuth flow, baca Flow end-to-end.