{"openapi":"3.0.3","info":{"title":"Trust Pay API","version":"1.0.0","description":"REST API untuk Trust Pay — payment gateway aggregator (Xendit + Midtrans)."},"servers":[{"url":"/api/v1","description":"Versi 1"}],"tags":[{"name":"System","description":"Health check & status"},{"name":"Auth","description":"Registrasi, login, OTP, sesi"},{"name":"Merchant","description":"Merchant, outlet, ledger"},{"name":"Transaction","description":"Transaksi & payment gateway"},{"name":"Webhook","description":"Callback dari payment gateway"}],"paths":{"/health":{"get":{"tags":["System"],"summary":"Health check","description":"Memeriksa konektivitas database dan Redis.","responses":{"200":{"description":"Sistem sehat"},"503":{"description":"Salah satu dependency down"}}}},"/auth/register":{"post":{"tags":["Auth"],"summary":"Registrasi pengguna baru","responses":{"201":{"description":"Berhasil, OTP verifikasi dikirim"},"409":{"description":"Email/telepon sudah terdaftar"}}}},"/auth/login":{"post":{"tags":["Auth"],"summary":"Login dengan email/telepon + password","responses":{"200":{"description":"Berhasil login"},"401":{"description":"Kredensial salah"}}}},"/auth/refresh":{"post":{"tags":["Auth"],"summary":"Refresh access token menggunakan refresh token cookie (rotasi otomatis)","responses":{"200":{"description":"Token baru diterbitkan"},"401":{"description":"Sesi tidak valid"}}}},"/auth/logout":{"post":{"tags":["Auth"],"summary":"Logout & revoke sesi aktif","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Berhasil logout"}}}},"/auth/me":{"get":{"tags":["Auth"],"summary":"Profil pengguna yang sedang login","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Profil pengguna"},"401":{"description":"Belum login"}}}},"/auth/sessions":{"get":{"tags":["Auth"],"summary":"Daftar sesi/device aktif milik pengguna saat ini","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar sesi aktif"}}}},"/auth/pin":{"post":{"tags":["Auth"],"summary":"Set PIN transaksi (6 digit)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"PIN berhasil diset"}}}},"/auth/otp/request":{"post":{"tags":["Auth"],"summary":"Kirim kode OTP (SMS/WhatsApp/Email)","responses":{"200":{"description":"OTP dikirim"},"429":{"description":"Terlalu sering meminta OTP"}}}},"/auth/otp/verify":{"post":{"tags":["Auth"],"summary":"Verifikasi kode OTP","responses":{"200":{"description":"OTP valid"},"422":{"description":"OTP salah/kedaluwarsa"}}}},"/auth/forgot-password":{"post":{"tags":["Auth"],"summary":"Minta OTP reset password","responses":{"200":{"description":"Jika akun ditemukan, OTP dikirim"}}}},"/auth/reset-password":{"post":{"tags":["Auth"],"summary":"Set password baru menggunakan OTP","responses":{"200":{"description":"Password berhasil direset"}}}},"/transactions/qris":{"post":{"tags":["Transaction"],"summary":"Buat transaksi QRIS (Xendit, dengan auto-failover)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"QR string berhasil dibuat"},"404":{"description":"Anda belum memiliki merchant aktif"},"502":{"description":"Semua payment gateway gagal memproses"}}}},"/transactions/virtual-account":{"post":{"tags":["Transaction"],"summary":"Buat transaksi Virtual Account (Xendit, dengan auto-failover)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Virtual Account berhasil dibuat"},"404":{"description":"Anda belum memiliki merchant aktif"}}}},"/payment-gateway/bank-account-inquiry":{"post":{"tags":["Transaction"],"summary":"Cek nama pemilik rekening bank (Flip Business)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Hasil inquiry rekening"}}}},"/webhooks/xendit":{"post":{"tags":["Webhook"],"summary":"Callback status pembayaran dari Xendit (verifikasi x-callback-token)","responses":{"200":{"description":"Webhook diproses"},"401":{"description":"Signature tidak valid"}}}},"/webhooks/flip":{"post":{"tags":["Webhook"],"summary":"Callback status disbursement dari Flip Business (verifikasi token)","responses":{"200":{"description":"Webhook diproses"},"401":{"description":"Token tidak valid"}}}},"/merchant/ledger":{"get":{"tags":["Merchant"],"summary":"Saldo ledger merchant (available + pending)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Saldo ledger"},"404":{"description":"Belum punya merchant aktif"}}}},"/merchant/ledger/mutations":{"get":{"tags":["Merchant"],"summary":"Riwayat mutasi ledger (paginated)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar mutasi"}}}},"/merchant/ledger/statement":{"get":{"tags":["Merchant"],"summary":"Unduh statement PDF bulanan (?year=&month=)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"File PDF"}}}},"/merchant/bank-accounts":{"get":{"tags":["Merchant"],"summary":"Daftar rekening bank merchant","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar rekening"}}},"post":{"tags":["Merchant"],"summary":"Tambah rekening bank (diverifikasi otomatis via Flip Business Bank Account Inquiry)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Rekening ditambahkan"},"422":{"description":"Rekening tidak dapat diverifikasi"}}}},"/merchant/register":{"post":{"tags":["Merchant"],"summary":"Daftarkan bisnis sebagai merchant (status PENDING, menunggu approval admin)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Pendaftaran dibuat"},"409":{"description":"Sudah punya pendaftaran"}}}},"/merchant/me":{"get":{"tags":["Merchant"],"summary":"Merchant milik pengguna saat ini, status apa pun (null jika belum daftar)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Data merchant atau null"}}}},"/merchant/outlets":{"get":{"tags":["Merchant"],"summary":"Daftar outlet merchant","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar outlet"}}},"post":{"tags":["Merchant"],"summary":"Tambah outlet","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Outlet dibuat"}}}},"/merchant/transactions":{"get":{"tags":["Transaction"],"summary":"Riwayat transaksi merchant (paginated)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar transaksi"}}}},"/admin/merchants":{"get":{"tags":["Merchant"],"summary":"Daftar merchant PENDING untuk direview (admin/superadmin)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar merchant pending"},"403":{"description":"Bukan admin"}}}},"/admin/merchants/{id}/approve":{"post":{"tags":["Merchant"],"summary":"Setujui pendaftaran merchant (admin/superadmin)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Merchant disetujui, ledger dibuat"}}}},"/admin/dashboard":{"get":{"tags":["System"],"summary":"Ringkasan dashboard superadmin (merchant, user, transaksi, revenue, gateway)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Data dashboard"},"403":{"description":"Bukan admin"}}}},"/merchant/dashboard":{"get":{"tags":["Merchant"],"summary":"Ringkasan dashboard merchant (revenue hari ini, grafik 7 hari)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Data dashboard merchant"}}}},"/admin/gateway-providers":{"get":{"tags":["System"],"summary":"Daftar payment gateway provider (admin/superadmin)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar provider"}}}},"/admin/gateway-providers/{id}":{"patch":{"tags":["System"],"summary":"Ubah status aktif/priority provider (superadmin)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Provider diperbarui"}}}},"/admin/users":{"get":{"tags":["System"],"summary":"Daftar pengguna (admin/superadmin)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar pengguna"}}}},"/admin/merchants/{id}/reject":{"post":{"tags":["Merchant"],"summary":"Tolak pendaftaran merchant (admin/superadmin)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Merchant ditolak"}}}},"/merchant/settlements":{"get":{"tags":["Merchant"],"summary":"Riwayat pencairan dana (paginated)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Daftar settlement"}}},"post":{"tags":["Merchant"],"summary":"Ajukan pencairan dana ke rekening bank (via Flip Business disbursement)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Pencairan diajukan, status PROCESSING"},"422":{"description":"Saldo tidak mencukupi"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","nullable":true}}}}}}}}