Payment Gateway API

Terima pembayaran QRIS dan Virtual Account tanpa menghubungkan akun e-wallet sendiri.

Semua endpoint membutuhkan header x-api-key. Lihat Authentication.

Payment Gateway memungkinkan Anda menerima pembayaran tanpa punya akun e-wallet atau merchant sendiri. Pembayaran ditampung di akun milik platform, hasilnya masuk ke saldo gateway Anda, dan dicairkan ke rekening bank Anda.

Bedanya dengan Payments API biasa:

Akun sendiriPayment Gateway
Akun penerimaAkun Anda, dihubungkan via Accounts APIAkun platform, dipilih otomatis
walletAccountIdUUID akun Anda"GATEWAY"
Uang masukLangsung ke akun AndaKe saldo gateway, cair H+1 hari kerja
BiayaTidak ada biaya gatewayVA Rp 3.000, QRIS 0,7% + Rp 200
Perlu persetujuanTidakYa, diajukan lewat dashboard

Aktivasi

Payment Gateway harus disetujui admin sebelum bisa dipakai. Ajukan lewat dashboard → Payment Gateway → Ajukan Akses, isi data usaha Anda, lalu tunggu peninjauan.

Status pengajuan bisa dibaca lewat API:

StatusKeterangan
NONEBelum pernah mengajukan
PENDINGPengajuan sedang ditinjau admin
APPROVEDAktif, gateway siap dipakai
REJECTEDDitolak atau dinonaktifkan — alasannya ada di field note

GET /api/v1/gateway

Status akses, metode yang tersedia, saldo, dan tarif — dalam satu request.

Response 200

{
  "status": "success",
  "data": {
    "access": {
      "status": "APPROVED",
      "note": null,
      "createdAt": "2026-08-20T04:11:02.000Z",
      "processedAt": "2026-08-21T02:40:11.000Z",
      "feeToCustomer": false
    },
    "walletAccountId": "GATEWAY",
    "methods": [
      { "value": "QRIS-DYNAMIC", "label": "QRIS" },
      { "value": "VA-BCA", "label": "Virtual Account BCA" }
    ],
    "balance": {
      "settled": 480000,
      "pending": 120000,
      "onHold": 0,
      "available": 480000
    },
    "fee": 3000,
    "qrisFee": { "rate": 0.007, "flat": 200 },
    "minWithdrawal": 50000
  }
}

Penjelasan Field Respons

FieldKeterangan
access.statusStatus pengajuan Anda (lihat tabel di atas)
access.feeToCustomertrue = biaya ditambahkan ke tagihan pembeli, false = biaya dipotong dari nominal Anda. Diatur di dashboard
walletAccountIdNilai yang dipakai saat membuat pembayaran. Selalu "GATEWAY"
methodsMetode yang bisa dilayani gateway saat ini. Kosong jika belum disetujui
balance.settledSudah melewati H+1 hari kerja, siap ditarik
balance.pendingSudah dibayar, masih menunggu settlement
balance.onHoldTerkunci oleh penarikan yang sedang diproses
balance.availableYang benar-benar bisa ditarik sekarang (settledonHold)
feeBiaya flat per transaksi Virtual Account, dalam rupiah
qrisFeeBiaya QRIS: rate × nominal + flat, dibulatkan ke rupiah
minWithdrawalMinimum penarikan

Endpoint ini sengaja tidak mengembalikan ID akun penampung. Akun mana yang menerima sebuah pembayaran ditentukan server saat pembayaran dibuat, jadi tidak ada yang perlu Anda pilih.

Contoh

curl 'https://mutasiku.co.id/api/v1/gateway' \
  -H 'x-api-key: YOUR_API_KEY'

Membuat Pembayaran Gateway

Sama persis dengan POST /api/v1/payments, hanya walletAccountId yang diisi "GATEWAY".

curl -X POST 'https://mutasiku.co.id/api/v1/payments' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "amount": 100000,
    "walletAccountId": "GATEWAY",
    "orderId": "order-123",
    "redirectUrl": "https://merchant.com/order/success"
  }'

Metode dipilih pembeli

Perhatikan contoh di atas tidak mengirim type. Untuk gateway ini cara yang dianjurkan: metode dipilih pembeli sendiri di halaman pembayaran, dari daftar yang benar-benar bisa dilayani saat itu.

Responsnya belum punya nominal akhir maupun QR, karena belum ada yang dipilih:

{
  "status": "success",
  "data": {
    "id": "595a196b-191c-4767-818e-a7646dd048e8",
    "amount": 100000,
    "expiresAt": "2026-08-31T10:32:52.268Z",
    "paymentUrl": "https://mutasiku.co.id/pay/TOKEN",
    "type": null,
    "methodSelection": "payer"
  }
}

Arahkan pembeli ke paymentUrl. Begitu mereka memilih metode, server menentukan akun penampung, kode unik, dan QR-nya. Anda tahu hasil akhirnya lewat Webhooks event payment.completed, atau dengan polling status pembayaran.

Menentukan metode sendiri

Kirim type kalau Anda memang ingin mengunci satu metode. Responsnya lengkap seperti pembayaran biasa — termasuk totalAmount, accountNumber, dan qrisImage.

curl -X POST 'https://mutasiku.co.id/api/v1/payments' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "amount": 100000,
    "walletAccountId": "GATEWAY",
    "orderId": "order-123",
    "type": "QRIS-DYNAMIC"
  }'

DIRECT tidak tersedia di gateway dan akan ditolak dengan 400. Transfer langsung tidak membawa identitas pembayaran apa pun selain nominalnya, sementara akun penampung dipakai bersama banyak merchant.


Biaya

MetodeBiaya
VA-BCA, VA-MANDIRI, VA-PERMATARp 3.000 per transaksi
QRIS, QRIS-DYNAMIC0,7% × nominal + Rp 200

Biaya hanya berlaku untuk pembayaran gateway. Kalau Anda memakai akun sendiri, tidak ada biaya gateway sama sekali.

Siapa yang menanggung

Diatur di dashboard → Payment Gateway → Pengaturan → Biaya, dan terbaca di access.feeToCustomer.

Ditanggung merchant (feeToCustomer: false, default) — pembeli membayar persis nominal yang Anda minta, biaya dipotong dari saldo Anda:

amount      : 100.000   ← yang Anda kirim, dan yang dibayar pembeli
biaya QRIS  :     900
saldo masuk :  99.100

Dibebankan ke pembeli (feeToCustomer: true) — tagihan dinaikkan sebesar biaya, saldo Anda bertambah persis sebesar nominal yang Anda minta:

amount      : 100.000   ← yang Anda kirim
tagihan     : 100.906   ← yang dibayar pembeli, muncul di field `amount` respons
biaya QRIS  :     906
saldo masuk : 100.000

Saat feeToCustomer: true, field amount pada respons dan webhook adalah nominal setelah dinaikkan, bukan angka yang Anda kirim. Nominal asli Anda tersimpan di metadata.baseAmount. Cocokkan order dengan orderId, bukan dengan nominal.

Kenaikannya bukan sekadar nominal + biaya: biaya QRIS dihitung dari total yang ditagihkan, sementara total itu sudah termasuk biaya. Server menaikkan sampai bagian Anda utuh — untuk Rp 1.000.000 kenaikannya Rp 7.251, bukan Rp 7.200.

Karena tiap metode punya biaya berbeda, tagihan akhir baru pasti setelah pembeli memilih metode. Halaman pembayaran menampilkan total per metode sebelum pembeli menentukan pilihannya.


Saldo dan Pencairan

Uang dari pembayaran gateway tidak langsung bisa ditarik. Alurnya:

Pembayaran selesai

Nominal masuk ke balance.pending.

Melewati H+1 hari kerja

Pindah ke balance.settled dan ikut terhitung di balance.available. Pembayaran hari Jumat, Sabtu, dan Minggu sama-sama cair hari Senin.

Ajukan penarikan

Lewat dashboard → Payment Gateway → Tarik Dana, minimum Rp 50.000. Nominalnya pindah ke balance.onHold sampai admin mentransfernya.

Penarikan hanya lewat dashboard, belum ada endpoint API-nya. Saldonya sendiri bisa dipantau kapan saja lewat GET /api/v1/gateway.


Errors

StatusKeterangan
400DIRECT dipakai di gateway, nominal di bawah minimum metode, atau nominal lebih kecil dari biaya
401API key tidak valid atau tidak ada
403Akses gateway Anda belum disetujui
503Tidak ada akun penampung yang bisa melayani metode tersebut saat ini

© 2026 PT. Cobra Code Indonesia. All rights reserved.

Last updated: 8/31/2026