Trusted Pay Dok. API v1.0 https://api.trustedpay.vip

API Merchant Trusted Pay

Terima pembayaran QRIS dan kirim penarikan ke rekening bank serta e-wallet lewat satu API JSON server-to-server.

Deposit QRISPenarikan ke bank & e-walletCallback bertanda tanganSignature SHA-512Waktu GMT+7

Pengenalan

Semua berjalan lewat HTTPS dengan body JSON yang ditandatangani client secret Anda. Server Anda memanggil Trusted Pay; Trusted Pay memanggil balik server Anda saat pembayaran atau penarikan mencapai status akhir.

LingkunganBase URL
Produksihttps://api.trustedpay.vip
Sandboxhttps://staging.trustedpay.vip

Base URL hanya membedakan sandbox dan produksi. Alamat ini permanen dan tidak pernah berubah, apa pun yang terjadi di balik API.

Yang Anda terima dari Trusted Pay

  • Client ID: identitas akun Anda di setiap request.
  • Client secret: untuk menandatangani request dan memverifikasi callback. Simpan hanya di server Anda.
  • Login portal merchant: transaksi, saldo, settlement, dan log callback.

Yang Anda kirim ke Trusted Pay

  • Alamat IP server yang akan memanggil API (IP whitelist).
  • URL callback default (HTTPS, bisa diakses publik).
Jangan pernah membuka client secret

Jangan taruh di browser, aplikasi mobile, atau repository publik. Siapa pun yang punya secret dan IP yang di-whitelist bisa membuat penarikan. Kalau mungkin bocor, minta Trusted Pay menerbitkan yang baru; secret lama langsung tidak berlaku.

Mulai cepat

  1. Dapatkan credential. Terima Client ID dan client secret, lalu pastikan IP server Anda sudah di-whitelist.
  2. Buat deposit. Panggil /api/order/create lalu tampilkan qrString sebagai QR code untuk pelanggan.
  3. Terima callback. Saat pelanggan membayar, Trusted Pay mengirim callback PAID yang ditandatangani ke notifyUrl Anda. Verifikasi signature-nya, lalu kreditkan pelanggan Anda.
  4. Tarik dana. Cek /api/withdrawal/balance, lalu panggil /api/withdrawal/create. Tunggu callback SUCCESS atau FAILED.
  5. Rekonsiliasi. Kalau callback terlambat atau request timeout, gunakan endpoint query dengan orderId yang sama.

Request & respons

  • Semua endpoint memakai POST dengan Content-Type: application/json. signature dikirim sebagai field di body JSON; tidak ada header otentikasi.
  • Nominal di request berupa bilangan bulat dalam IDR (tanpa desimal). Nominal di respons penarikan berupa string dengan dua desimal, mis. "50000.00".
  • Waktu memakai format YYYY-MM-DD HH:mm:ss dalam GMT+7.
  • orderId adalah referensi milik Anda dan harus unik per merchant untuk deposit, dan terpisah untuk penarikan. Gunakan huruf, angka, - dan _, maksimal 100 karakter.
  • Setiap respons ber-HTTP status 200 dengan field code. Baca code, bukan status HTTP.
Bentuk respons
{
  "code": 200,
  "message": "Success",
  "data": { /* objek sesuai endpoint, null jika error */ }
}
HTTP 5xx atau timeout jaringan

Anggap hasilnya belum diketahui. Jangan membuat transaksi baru dengan orderId berbeda. Panggil endpoint query dengan orderId yang sama, atau ulangi request create yang sama persis: request ini idempoten.

Signature

Gabungkan field di bawah dengan pemisah |, tambahkan client secret di akhir, hash dengan SHA-512, lalu kirim digest hex huruf kecil sebagai signature. Pakai nilai yang persis sama dengan yang ada di body; nominal ditulis sebagai bilangan bulat biasa.

EndpointString signature
/api/order/createclientId|orderId|totalAmount|clientSecret
/api/order/queryclientId|orderId|clientSecret
/api/withdrawal/createclientId|orderId|requestAmount|clientSecret
/api/withdrawal/queryclientId|orderId|clientSecret
/api/withdrawal/balanceclientId|method|clientSecret
/api/withdrawal/balance-detailclientId|clientSecret
Callback (dari Trusted Pay)clientId|orderId|refCode|status|clientSecret

Contoh perhitungan

clientId8F3C2A9E1B7D4C6A0E5F9B2D7C1A3E8F
orderId / totalAmountINV-1001 / 200000
clientSecretyour-client-secret
String yang di-hash8F3C2A9E1B7D4C6A0E5F9B2D7C1A3E8F|INV-1001|200000|your-client-secret
signature0d80561a60fb1bdb3997158f84fb8d808ea2dc1cbe7357aeacb647840ea37abc0097547132d28a01d48a7d46658a4772e281a6608590ac264003b4d448e5b250
import hashlib

def sign(*parts) -> str:
    """SHA-512 of the parts joined with '|' (client secret last), lowercase hex."""
    return hashlib.sha512("|".join(str(p) for p in parts).encode("utf-8")).hexdigest()

signature = sign(client_id, order_id, total_amount, client_secret)

Error & pesan

codeArtiYang perlu dilakukan
200BerhasilGunakan data.
400Error validasi atau bisnis; message menjelaskan penyebabnyaPerbaiki request. Jangan diulang membabi buta.
403IP address not allowed.Panggil dari IP server yang di-whitelist, atau minta Trusted Pay menambahkan IP tersebut.
429Terlalu banyak requestPerlambat dan ulangi setelah satu detik (lihat rate limit).

Pesan yang sering muncul

PesanPenyebab
Invalid clientId.Client ID tidak dikenal atau sudah dinonaktifkan.
Invalid signature.String signature, urutan field, format nominal, atau secret salah.
Duplicate orderId.orderId sudah dipakai dengan detail berbeda (atau untuk order yang sudah EXPIRED).
Order is being processed. Please query the order status.Deposit yang sama masih sedang dibuat. Cek statusnya beberapa detik lagi.
Withdrawal is being processed. Please query the status.Request penarikan yang sama sedang diproses. Cek statusnya.
Payment gateway temporarily unavailable. Please try again.QR belum bisa diterbitkan saat ini. Ulangi request yang sama.
Payment channel is not configured.Akun Anda belum diaktifkan untuk produk ini. Hubungi Trusted Pay.
Minimum amount is … / Maximum amount is …Nominal di luar limit akun Anda; pesan menyebutkan limitnya.
Insufficient balance.Saldo available lebih kecil dari nominal penarikan + fee. Tidak ada saldo yang dipotong.
Account number could not be verified.Rekening tujuan tidak ada atau tidak aktif. Tidak ada saldo yang dipotong.
Bank is not available for this payout. / E-wallet is not available for this payout.bankCode / ewalletCode tidak didukung (lihat kode).
Withdrawal was rejected.Penarikan ditolak. Tidak ada saldo yang dipotong.
field: messageAda field yang gagal validasi, mis. customerPhone: Phone number must start with 62.

Pesan dari API selalu dalam bahasa Inggris, apa pun bahasa halaman ini.

Limit & rate limit

ProdukDefault per transaksi
Deposit (QRIS)Rp 10.000 – Rp 10.000.000
PenarikanRp 10.000 – Rp 50.000.000 (nominal penarikan, fee ditambahkan di atasnya)

Akun Anda bisa memiliki limit berbeda. Pesan error selalu menyebutkan limit yang berlaku, dan /api/withdrawal/balance memberi nominal penarikan terbesar yang bisa Anda lakukan saat ini.

EndpointRate limit default
/api/order/create10 request / detik
/api/order/query5 request / detik
/api/withdrawal/create5 request / detik
/api/withdrawal/query, /balance, /balance-detail2 request / detik (bersama)
Utamakan callback daripada polling

Perubahan status dikirim ke notifyUrl Anda. Gunakan endpoint query untuk rekonsiliasi dan setelah timeout, bukan dalam loop rapat.

Deposit (QRIS)

POST/api/order/create

Membuat pembayaran QRIS dan mengembalikan isi QR untuk ditampilkan ke pelanggan.

FieldTipeKeterangan
clientId wajibstringClient ID Anda.
orderId wajibstring ≤ 100Referensi deposit unik milik Anda.
totalAmount wajibintegerNominal (IDR) yang dibayar pelanggan.
paymentType opsionalstringQRIS (default dan satu-satunya nilai).
customerName wajibstring ≤ 255Nama pembayar.
customerEmail wajibstringAlamat email yang valid.
customerPhone wajibstringDiawali 62, hanya angka, 10–15 karakter, mis. 6281234567890.
notifyUrl opsionalstring ≤ 500URL callback untuk order ini. Default-nya URL callback akun Anda. Harus URL http(s) publik.
returnUrl opsionalstringHalaman tujuan pelanggan setelahnya (disimpan, tidak dipakai Trusted Pay).
signature wajibstringSHA512(clientId|orderId|totalAmount|clientSecret)
curl -X POST https://api.trustedpay.vip/api/order/create \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "8F3C2A9E1B7D4C6A0E5F9B2D7C1A3E8F",
    "orderId": "INV-1001",
    "totalAmount": 200000,
    "paymentType": "QRIS",
    "customerName": "Andi",
    "customerEmail": "[email protected]",
    "customerPhone": "6281234567890",
    "notifyUrl": "https://merchant.example/callback/trustedpay",
    "signature": "0d80561a60fb1bdb3997158f84fb8d808ea2dc1cbe7357aeacb647840ea37abc0097547132d28a01d48a7d46658a4772e281a6608590ac264003b4d448e5b250"
  }'
Respons
{
  "code": 200,
  "message": "Success",
  "data": {
    "refCode": "PX261021003514CR1RE6",
    "transactionTime": "2026-10-21 00:35:14",
    "orderId": "INV-1001",
    "totalAmount": 200000,
    "customerName": "Andi",
    "customerEmail": "[email protected]",
    "customerPhone": "6281234567890",
    "notifyUrl": "https://merchant.example/callback/trustedpay",
    "returnUrl": null,
    "status": "PENDING",
    "paidAt": null,
    "expiredAt": "2026-10-21 01:05:14",
    "qrString": "00020101021226610012ID.CO.QRIS.WWW…6304B896"
  }
}
  • Tampilkan qrString sebagai QR code (library QR apa pun). Semua aplikasi bank atau e-wallet yang mendukung QRIS bisa membayarnya.
  • refCode adalah referensi Trusted Pay. Simpan berdampingan dengan orderId Anda.
  • QR berlaku 30 menit secara default; expiredAt memberi waktu pasti QR berhenti bisa dibayar.

POST/api/order/query

FieldTipeKeterangan
clientId wajibstringClient ID Anda.
orderId wajibstringReferensi deposit Anda.
signature wajibstringSHA512(clientId|orderId|clientSecret)

Mengembalikan objek data yang sama seperti create, dengan status dan paidAt terkini. Order yang tidak dikenal mengembalikan code: 400, Order not found.

Alur status order

PENDING→PAID|EXPIRED|FAILED
StatusArtiCallback
PENDINGQR sudah terbit, menunggu pelanggan membayar.–
PAIDPembayaran terkonfirmasi. Nominal bersih dikreditkan ke saldo pending Anda.Ya
EXPIREDTidak dibayar tepat waktu. Status ini dipasang setelah jaringan pembayaran memastikan QR tidak dibayar, biasanya dalam 10 menit setelah expiredAt.Tidak
FAILEDQR tidak bisa diterbitkan. Anda boleh memanggil create lagi dengan orderId yang sama; refCode dan QR baru akan diterbitkan.Tidak
Pembayaran bisa masuk setelah EXPIRED

Kalau pelanggan membayar di detik terakhir dan jaringan melaporkannya terlambat, status order berubah dari EXPIRED menjadi PAID. Saldo Anda dikreditkan dan Anda menerima callback PAID seperti biasa. Selalu proses callback PAID yang valid, meskipun order itu sudah Anda anggap expired.

Idempotensi
  • Mengulang create dengan orderId dan totalAmount yang sama mengembalikan order yang sudah ada (QR yang sama selama masih PENDING).
  • orderId yang sama dengan totalAmount berbeda, atau untuk order yang EXPIRED, mengembalikan Duplicate orderId.. Gunakan orderId baru untuk pembayaran baru.

Penarikan (withdrawal)

POST/api/withdrawal/create

Mengirim dana dari saldo available Anda ke rekening bank atau e-wallet. Rekening tujuan diverifikasi sebelum dana bergerak.

FieldTipeKeterangan
clientId wajibstringClient ID Anda.
orderId wajibstring ≤ 100Referensi penarikan unik milik Anda.
requestAmount wajibintegerNominal (IDR) yang diterima penerima. Fee penarikan ditambahkan di atasnya.
method wajibstringBANK_ACCOUNT atau EWALLET.
bankCodestringKode bank 3 digit, wajib untuk BANK_ACCOUNT (lihat kode).
ewalletCodestringWajib untuk EWALLET: DANA, GOPAY, OVO, SHOPEEPAY, LINKAJA, SAKUKU.
accountNumber wajibstring ≤ 50Hanya angka. Untuk e-wallet, nomor HP yang terdaftar.
accountName wajibstring ≤ 255Nama penerima menurut data Anda. Nama hasil verifikasi dikembalikan di respons.
notifyUrl opsionalstring ≤ 500URL callback untuk penarikan ini. Default-nya URL callback akun Anda.
signature wajibstringSHA512(clientId|orderId|requestAmount|clientSecret)
curl -X POST https://api.trustedpay.vip/api/withdrawal/create \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "8F3C2A9E1B7D4C6A0E5F9B2D7C1A3E8F",
    "orderId": "WD-1001",
    "requestAmount": 50000,
    "method": "BANK_ACCOUNT",
    "bankCode": "014",
    "accountNumber": "1234567890",
    "accountName": "Andi Wijaya",
    "signature": "<SHA512(clientId|WD-1001|50000|clientSecret)>"
  }'
Respons
{
  "code": 200,
  "message": "Success",
  "data": {
    "refCode": "WX261021101502KD8Q2M",
    "orderId": "WD-1001",
    "accountNumber": "1234567890",
    "accountName": "ANDI WIJAYA",
    "bank": { "name": "BCA (Bank Central Asia)", "code": "014" },
    "requestAmount": "50000.00",
    "withdrawalFee": "1600.00",
    "withdrawalAmount": "51600.00",
    "status": "PENDING",
    "statusRemark": null,
    "requestAt": "2026-10-21 10:15:02",
    "processedAt": null,
    "payoutProvider": "TRUSTEDPAY",
    "method": "BANK_ACCOUNT"
  }
}
  • withdrawalAmount = requestAmount + withdrawalFee, dipotong dari saldo available saat request diterima.
  • accountName adalah nama hasil verifikasi bank atau e-wallet dan bisa berbeda dari nama yang Anda kirim.
  • payoutProvider selalu TRUSTEDPAY.
  • Siapkan timeout hingga 90 detik: rekening diverifikasi dulu sebelum transfer dikirim.

POST/api/withdrawal/query

Body: clientId, orderId, signature = SHA512(clientId|orderId|clientSecret). Mengembalikan objek data yang sama seperti create. Penarikan yang tidak dikenal mengembalikan Withdrawal not found.

POST/api/withdrawal/balance

Saldo Anda dan fee untuk metode penarikan tertentu. Body: clientId, method (BANK_ACCOUNT default, atau EWALLET), signature = SHA512(clientId|method|clientSecret).

Data respons
{
  "payoutProvider": "TRUSTEDPAY",
  "method": "BANK_ACCOUNT",
  "pendingBalance": "34580.00",
  "availableBalance": "144000.00",
  "withdrawalFee": "1600.00",
  "maxRequestAmount": "142400.00",
  "hasBalance": true
}

maxRequestAmount adalah requestAmount terbesar yang bisa Anda kirim saat ini (saldo available dikurangi fee, dibatasi limit Anda). hasBalance bernilai true bila sudah mencapai minimum penarikan.

POST/api/withdrawal/balance-detail

Body: clientId, signature = SHA512(clientId|clientSecret). Mengembalikan { "pendingBalance": "34580.00", "availableBalance": "144000.00" }.

Alur status penarikan

PENDING→ON_PROCESS→SUCCESS|FAILED
StatusArtiCallback
PENDINGDiterima dan saldo sudah dipotong; sedang dikirim.–
ON_PROCESSTransfer sedang diproses di bank atau e-wallet.–
SUCCESSDana sudah sampai. processedAt terisi.Ya
FAILEDDana tidak terkirim. withdrawalAmount dikembalikan otomatis ke saldo available Anda; statusRemark menjelaskan penyebabnya.Ya
  • Kalau rekening tidak bisa diverifikasi, create mengembalikan code: 400 dan tidak ada saldo yang dipotong.
  • Mengulang create dengan orderId yang sama serta nominal, metode, bank atau e-wallet, dan rekening yang sama mengembalikan penarikan yang sudah ada: saldo tidak dipotong dua kali.
  • orderId yang sama dengan salah satu detail di atas berbeda mengembalikan Duplicate orderId..
Jangan pernah mengirim ulang penarikan dengan orderId baru setelah timeout

Request yang timeout mungkin sebenarnya sudah diterima. Cek orderId aslinya (atau ulangi request yang identik) dan tunggu callback akhir. Membuat penarikan kedua dengan orderId baru bisa membuat penerima dibayar dua kali.

Saldo pending & available

  • Deposit yang sudah dibayar dikreditkan, setelah dipotong fee, ke saldo pending Anda.
  • Dana menjadi available setelah settlement. Settlement berjalan harian: deposit yang dibayar pada hari D (00:00:00–23:59:59 GMT+7) biasanya tersedia pada D+1 pukul 15:00 GMT+7, setiap hari termasuk akhir pekan.
  • Ketersediaan dana mengikuti settlement yang sebenarnya, jadi sesekali bisa lebih lambat.
  • Hanya saldo available yang bisa ditarik. Portal merchant menampilkan perkiraan waktu dana pending menjadi available.

Callback

Trusted Pay mengirim POST dengan body JSON ke notifyUrl Anda:

  • Saat deposit menjadi PAID.
  • Saat penarikan menjadi SUCCESS atau FAILED.
AturanDetail
KonfirmasiBalas dengan HTTP 2xx apa pun dalam 5 detik. Kerjakan proses yang lama setelah membalas.
PengulanganMaksimal 6 kali percobaan. Jeda antar percobaan: 10 s, 30 s, 1 min, 5 min, 15 min. Redirect tidak diikuti.
DuplikatCallback bisa datang lebih dari sekali. Proses secara idempoten berdasarkan refCode + status.
UrutanJangan bergantung pada urutan kedatangan; gunakan status.
KeamananSelalu verifikasi signature. Bisa juga dikonfirmasi lewat endpoint query.
Kirim ulangCallback bisa dikirim ulang dari portal merchant (detail order atau penarikan).

Callback deposit

{
  "clientId": "8F3C2A9E1B7D4C6A0E5F9B2D7C1A3E8F",
  "orderId": "INV-1001",
  "refCode": "PX261021003514CR1RE6",
  "totalAmount": 200000,
  "status": "PAID",
  "paidAt": "2026-10-21 00:37:07",
  "rrn": "AX4UEDYO2VXN",
  "signature": "SHA512(clientId|orderId|refCode|status|clientSecret)"
}

rrn adalah referensi dari jaringan pembayaran (berguna untuk komplain pelanggan); bisa bernilai null.

Callback penarikan

{
  "clientId": "8F3C2A9E1B7D4C6A0E5F9B2D7C1A3E8F",
  "refCode": "WX261021101502KD8Q2M",
  "orderId": "WD-1001",
  "accountNumber": "1234567890",
  "accountName": "ANDI WIJAYA",
  "bank": { "name": "BCA (Bank Central Asia)", "code": "014" },
  "method": "BANK_ACCOUNT",
  "requestAmount": "50000.00",
  "withdrawalFee": "1600.00",
  "withdrawalAmount": "51600.00",
  "status": "SUCCESS",
  "statusRemark": null,
  "requestAt": "2026-10-21 10:15:02",
  "processedAt": "2026-10-21 10:15:31",
  "signature": "SHA512(clientId|orderId|refCode|status|clientSecret)"
}

statusRemark hanya terisi untuk FAILED.

Verifikasi callback

import hashlib, hmac
from flask import Flask, request

app = Flask(__name__)

@app.post("/callback/trustedpay")
def trustedpay_callback():
    cb = request.get_json(force=True)
    expected = hashlib.sha512(
        "|".join([cb["clientId"], cb["orderId"], cb["refCode"], cb["status"], CLIENT_SECRET]).encode()
    ).hexdigest()
    if cb["clientId"] != CLIENT_ID or not hmac.compare_digest(expected, cb.get("signature", "").lower()):
        return {"ok": False}, 401
    # idempotent: skip if (refCode, status) was already handled
    handle(cb)
    return {"ok": True}, 200

Kode bank & e-wallet

Kirim ewalletCode untuk penarikan EWALLET, atau bankCode 3 digit untuk penarikan BANK_ACCOUNT. Kode yang tidak ada di daftar ini ditolak sebelum dana bergerak.

E-wallet

ewalletCodeE-wallet
DANADANA
GOPAYGoPay
OVOOVO
SHOPEEPAYShopeePay
LINKAJALinkAja
SAKUKUSakuku

Bank (128)

bankCodeBank
002BRI (Bank Rakyat Indonesia)
008Bank Mandiri
009BNI (Bank Negara Indonesia)
011Bank Danamon
013Bank Permata
014BCA (Bank Central Asia)
016Maybank Indonesia
019Panin Bank
022CIMB Niaga
023UOB Indonesia (TMRW)
028OCBC NISP
031Citibank
032JPMorgan Chase Bank
033Bank of America
036China Construction Bank Indonesia
037Bank Artha Graha Internasional
042MUFG Bank (Bank of Tokyo Mitsubishi UFJ)
046DBS Indonesia
047Bank Resona Perdania
048Bank Mizuho Indonesia
050Standard Chartered Bank
054Bank Capital Indonesia
057Bank BNP Paribas Indonesia
061ANZ Indonesia
067Deutsche Bank AG
069Bank of China (Hong Kong)
076Bank Bumi Arta
087HSBC Indonesia
088Bank Antardaerah
089Rabobank International Indonesia
095J Trust Bank
097Bank Mayapada
110Bank BJB
111Bank DKI
112BPD DIY
113Bank Jateng
114Bank Jatim
115Bank Jambi
116Bank Aceh Syariah
117Bank Sumut
118Bank Nagari (Sumbar)
119Bank Riau Kepri
120Bank Sumsel Babel
121Bank Lampung
122Bank Kalsel
123Bank Kalbar
124Bank Kaltimtara
125Bank Kalteng
126Bank Sulselbar
127Bank SulutGo
128Bank NTB Syariah
129BPD Bali
130Bank NTT
131Bank Maluku Malut
132Bank Papua
133Bank Bengkulu
134Bank Sulteng
135Bank Sultra
137Bank Banten
145Bank Nusantara Parahyangan
146Bank of India Indonesia
147Bank Muamalat
151Bank Mestika Dharma
152Bank Shinhan Indonesia
153Bank Sinarmas
157Bank Maspion Indonesia
161Bank Ganesha
164ICBC Indonesia
167QNB Indonesia
200BTN (Bank Tabungan Negara)
212Bank Woori Saudara
213BTPN / Jenius
253Bank Nano Syariah
405Bank Victoria Syariah
425BJB Syariah
426Bank Mega
441KB Bank (Bukopin / Wokee)
459Krom Bank Indonesia
472Bank Jasa Jakarta
484KEB Hana / LINE Bank
485MNC Bank (Motion)
490Bank Neo Commerce
494BRI Agroniaga
498SBI Indonesia
501blu / BCA Digital
503Bank Nationalnobu
506Bank Mega Syariah
513Bank Ina Perdana
517Panin Dubai Syariah
520Bank Prima Master
521KB Bukopin Syariah
523Bank Sahabat Sampoerna
526Bank Oke Indonesia
531Bank Amar Indonesia
535SeaBank
536BCA Syariah
542Bank Jago
547BTPN Syariah
548Bank Multi Arta Sentosa
553Bank Mayora Indonesia
555Bank Index Selindo
559Bank CNB (Centratama Nasional)
564Bank Mandiri Taspen
566Bank Victoria International
567Allo Bank
600BPR LSB (ATMB LSB)
688BPR KS
699BPR Eka (Bank Eka)
721Bank Permata UUS
722Bank Danamon UUS
723BTN UUS
724Bank DKI UUS
725Bank Jateng UUS
727Bank Kalbar UUS
728Bank Kalsel UUS
729Bank Kaltimtara UUS
733Bank Sulselbar UUS
734Bank Sinarmas UUS
736BPD DIY UUS
777Finnet
789Dompetku
867BPR Eka
899DOKU
945Bank IBK Indonesia
947Bank Aladin Syariah
949CTBC Indonesia
950Commonwealth Bank
987ATMB Plus

Checklist go-live

  • IP server produksi sudah di-whitelist, dan client secret hanya disimpan di server.
  • Signature dihitung dari nilai body yang persis sama, dalam hex SHA-512 huruf kecil.
  • Endpoint callback memakai HTTPS dan bisa diakses publik, memverifikasi signature, membalas 2xx dalam 5 detik, dan idempoten berdasarkan refCode + status.
  • Callback PAID tetap diproses meskipun order sudah Anda anggap expired.
  • Timeout dan 5xx diselesaikan lewat endpoint query. Penarikan tidak pernah dibuat ulang dengan orderId baru.
  • Anda membaca field code di respons, bukan hanya status HTTP.
  • Alur penarikan Anda mengecek /api/withdrawal/balance lebih dulu dan menangani Insufficient balance.