Lewati ke isi

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

  1. User pilih nominal (mis. Rp 100.000)
  2. API menghasilkan nominal unik (mis. Rp 100.347) + kode GP-XXXXXXXX
  3. User transfer ke rekening operator (env GARUDA_PAY_DEPOSIT_*)
  4. Admin approve di Admin Monitor → saldo dikredit + mint GIDR

Withdraw

  1. User isi rekening tujuan + nominal
  2. Saldo & GIDR dikunci langsung
  3. Admin transfer manual ke rekening user
  4. 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):

  1. Manual transfer — sudah diimplementasi ✅
  2. Bikin CV (~1–2 minggu, biaya jutaan) → baru apply Oy! atau Paylabs
  3. White-label — partner yang sudah punya PJP (bagi hasil)

Migrasi ke gateway (nanti)

  1. Set GARUDA_PAY_FIAT_MODE=gateway
  2. Implementasi adapter di apps/api/src/garudaPay/rails.ts (gatewayTopUp, gatewayWithdraw)
  3. Webhook otomatis menggantikan approve manual admin
  4. 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 & limit
  • apps/api/src/garudaPay/fiatRails.ts — logika deposit/withdraw
  • apps/api/src/garudaPay/fiatStore.ts — persistensi antrian
  • apps/api/src/routes/garudaPay.ts — endpoint wallet
  • apps/api/src/routes/admin.ts — approve/reject admin