Garuda Pay — Deposit & Withdraw Tanpa PT¶
Panduan rail fiat untuk operator tanpa legalitas PT/CV, plus rekomendasi gateway saat sudah punya badan usaha.
Kenapa Xendit, Doku, Oy, dll. menolak?¶
Hampir semua payment gateway & e-money Indonesia mewajibkan:
| Dokumen | Keterangan |
|---|---|
| PT atau CV | Akta, SK Kemenkumham |
| NIB | Nomor Induk Berusaha |
| NPWP perusahaan | Pajak badan |
| Rekening perusahaan | BCA/Mandiri/dll. atas nama PT |
| Direktur/Komisaris | KTP + selfie |
Ini bukan kebijakan vendor semata — mengacu regulasi BI/OJK (PJP, payment system). Tanpa entitas legal, tidak ada aggregator IDR resmi yang mengizinkan operasi wallet skala publik.
Solusi yang dipakai Garuda Chain (tanpa PT)¶
Rail: manual_transfer (default)¶
User minta deposit Admin cek mutasi bank Saldo + GIDR naik
│ │ │
▼ ▼ ▼
POST /fiat/deposit → Transfer masuk cocok POST admin …/approve
(kode + nominal unik) nominal & berita transfer
Deposit
- User pilih nominal (mis. Rp 100.000)
- API menghasilkan nominal unik (mis. Rp 100.347) + kode
GP-XXXXXXXX - User transfer ke rekening operator (env
GARUDA_PAY_DEPOSIT_*) - Admin approve di Admin Monitor → saldo dikredit + mint GIDR
Withdraw
- User isi rekening tujuan + nominal
- Saldo & GIDR dikunci langsung
- Admin transfer manual ke rekening user
- Admin approve → selesai · atau reject → saldo dikembalikan
Kelebihan: Tanpa PT, tanpa biaya gateway, bisa jalan hari ini.
Kekurangan: Tidak otomatis, volume terbatas, tanggung jawab rekonsiliasi di operator.
Rail lain tanpa PT (pelengkap)¶
| Rail | Deposit | Withdraw | Catatan |
|---|---|---|---|
| Transfer P2P antar wallet | ✅ | ✅ | Sudah ada (/transfer) — tanpa keluar ke bank |
| GDC / GIDR on-chain | ✅ | ✅ | Crypto-native, tanpa IDR |
| Agen/OTC manual | ✅ | ✅ | User bayar ke agen terpercaya |
| Crypto on-ramp individu | ⚠️ | ⚠️ | Transak/MoonPay — sering tanpa PT, tapi bukan IDR lokal |
Konfigurasi server¶
Tambahkan di environment API production:
# Mode fiat: manual_transfer (tanpa PT) | gateway (setelah punya PT)
GARUDA_PAY_FIAT_MODE=manual_transfer
# Rekening penerima deposit (bisa rekening pribadi operator — risiko & limit sendiri)
GARUDA_PAY_DEPOSIT_BANK_NAME=BCA
GARUDA_PAY_DEPOSIT_BANK_CODE=bca
GARUDA_PAY_DEPOSIT_ACCOUNT=1234567890
GARUDA_PAY_DEPOSIT_ACCOUNT_NAME=Nama Pemilik Rekening
# Limit (opsional)
GARUDA_PAY_FIAT_MIN_DEPOSIT=10000
GARUDA_PAY_FIAT_MAX_DEPOSIT=5000000
GARUDA_PAY_FIAT_MIN_WITHDRAW=10000
GARUDA_PAY_FIAT_MAX_WITHDRAW=2000000
GARUDA_PAY_FIAT_DEPOSIT_EXPIRE_HOURS=24
API Endpoints¶
Publik (wallet)¶
| Method | Path | Fungsi |
|---|---|---|
GET |
/api/v1/garuda-pay/fiat/config |
Info rekening, limit, instruksi |
POST |
/api/v1/garuda-pay/fiat/deposit |
Buat permintaan deposit |
POST |
/api/v1/garuda-pay/fiat/withdraw |
Buat permintaan withdraw |
GET |
/api/v1/garuda-pay/fiat/requests/:address |
Riwayat permintaan user |
Admin (butuh ADMIN_API_KEY)¶
| Method | Path | Fungsi |
|---|---|---|
GET |
/api/v1/admin/garuda-pay/fiat/requests?status=pending |
Antrian |
POST |
/api/v1/admin/garuda-pay/fiat/requests/:id |
{ "action": "approve" \| "reject", "note": "..." } |
Contoh deposit¶
POST /api/v1/garuda-pay/fiat/deposit
{
"address": "0x…",
"amountIdr": 100000
}
Response:
{
"request": {
"id": "dep-…",
"referenceCode": "GP-ABC12XYZ",
"amountIdr": 100000,
"transferAmountIdr": 100347,
"status": "pending",
"expiresAt": 1710000000000
},
"config": { "depositBank": { … } }
}
User transfer tepat Rp 100.347 dengan berita: GP-ABC12XYZ.
Rekomendasi gateway (setelah punya PT)¶
Ranking kemudahan onboarding untuk startup kecil di Indonesia (2024–2026, berdasarkan praktik umum — konfirmasi ulang ke sales masing-masing):
| Peringkat | Provider | Deposit (VA/QRIS) | Withdraw | Kenapa |
|---|---|---|---|---|
| 🥇 | Oy! Indonesia | VA, link bayar | Disbursement BI-FAST | Proses relatif cepat, ramah UMKM/startup, dokumentasi API jelas |
| 🥈 | Paylabs | VA, QRIS | Disbursement | Onboarding startup lebih ringan daripada player lama |
| 🥉 | Doku | Lengkap | Disbursement | Stabil & mature; dokumen lebih formal & lama |
| 4 | Faspay | VA, kartu | Terbatas | Cocok merchant e-commerce; proses klasik |
| 5 | Brick | Account linking | Transfer | Butuh partnership open finance; kurang untuk solo tanpa PT |
| 6 | Flip for Business | — | Disbursement kuat | Fokus payout; wajib entitas bisnis |
| 7 | 2C2P / iPay88 | Kartu, VA | Terbatas | Lebih korporat / cross-border |
Tidak direkomendasikan tanpa PT: semua di atas.
Alternatif paling mudah secara administrasi (bukan teknis):
- Manual transfer — sudah diimplementasi ✅
- Bikin CV (~1–2 minggu, biaya jutaan) → baru apply Oy! atau Paylabs
- White-label — partner yang sudah punya PJP (bagi hasil)
Migrasi ke gateway (nanti)¶
- Set
GARUDA_PAY_FIAT_MODE=gateway - Implementasi adapter di
apps/api/src/garudaPay/rails.ts(gatewayTopUp,gatewayWithdraw) - Webhook otomatis menggantikan approve manual admin
- Tetap simpan antrian fiat untuk audit
Risiko & compliance (penting)¶
- Rekening pribadi untuk terima deposit komersial = risiko pajak & banking compliance.
- Limit harian kecil + KYC wallet disarankan sebelum volume naik.
- Untuk skala publik, rencanakan CV minimal → gateway resmi.
File terkait di repo¶
apps/api/src/garudaPay/fiatConfig.ts— env & limitapps/api/src/garudaPay/fiatRails.ts— logika deposit/withdrawapps/api/src/garudaPay/fiatStore.ts— persistensi antrianapps/api/src/routes/garudaPay.ts— endpoint walletapps/api/src/routes/admin.ts— approve/reject admin