Semua yang Anda butuhkan buat integrasi — bisa dibaca sekarang, sebelum daftar akun. Contoh di bawah pakai API Key placeholder; setelah daftar, ganti dengan API Key asli dari dashboard Anda. Klik judul tiap section buat buka/tutup isinya.
Daftar endpoint yang tersedia untuk integrasi.
Belum punya akun? Daftar gratis di sini dulu — API Key aktif begitu akun dibuat. Setelah itu, ikuti 4 langkah ini buat dapetin transaksi pertama Anda jalan.
curl -X POST https://bkent.web.id/api/v1/generate.aspx \
-H "Content-Type: application/json" \
-H "Authorization: Bearer NG-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-d '{
"order_id": "TEST-20260928153010",
"amount": 10000,
"payment_method": "QRIS",
"customer_name": "Test Integrasi"
}'
Bearer NG-xxxx... di atas cuma placeholder — ganti dengan API Key asli dari dashboard Anda setelah daftar. Kalau dijalankan dari komputer/laptop pribadi (bukan server yang sudah di-whitelist), Anda akan dapat error 403 IP Not whitelist — itu normal, jalankan dari server yang IP-nya sudah didaftarkan di langkah 1.
Semua request dikirimkan ke Base URL menggunakan metode POST. Anda wajib menyertakan API Key pada HTTP Header menggunakan metode Bearer Token, serta memastikan IP server Anda telah didaftarkan pada menu Whitelist.
Content-Type: application/json Authorization: Bearer [API_KEY_ANDA_DISINI]
https://bkent.web.id/api/v1
Untuk mempermudah integrasi, kami telah menyediakan Class PHP siap pakai yang mencakup seluruh fungsi endpoint di dokumentasi ini (termasuk QRIS, VA, dan DANA).
Penting: File yang didownload sudah otomatis terisi dengan Base URL sistem ini. Anda hanya perlu membuka file tersebut dan memasukkan API Key Anda pada variabel $apiKey.
Endpoint: /generate.aspx
Endpoint tunggal untuk membuat tagihan pembayaran baru untuk pelanggan Anda — mendukung 3 metode: QRIS (default), VA (Virtual Account bank), dan DANA. Pilih lewat field payment_method.
channel (bank yang Anda pilih) benar-benar menentukan bank tujuan transfer, atau semua VA diproses lewat satu jalur transfer antar-bank universal. Kalau pelanggan Anda melaporkan kendala saat transfer dari bank tertentu, hubungi support kami — nomor VA-nya tetap valid, ini murni soal label bank yang ditampilkan.| FIELD | TYPE | REQ | DESCRIPTION |
|---|---|---|---|
| order_id | string | Y | ID Transaksi unik dari sistem/website Anda. |
| amount | integer | Y | Nominal transaksi (Minimal Rp 10.000). |
| payment_method | string | N | QRIS (default kalau kosong), VA, atau DANA. |
| channel | string | Kondisional | Wajib diisi kalau payment_method = VA. Lihat daftar channel di Referensi Kode Bank & Channel. |
| customer_name | string | N | Nama pelanggan (Opsional, max 50 char). |
| customer_phone | string | N | Nomor WhatsApp/HP pelanggan (Opsional). |
Berlaku instan, kadaluarsa dalam 5 menit. Response berisi string QRIS mentah + URL gambar QR siap ditampilkan.
{
"order_id": "INV-20260720-001",
"amount": 50000,
"payment_method": "QRIS",
"customer_name": "Budi Santoso",
"customer_phone": "081234567890"
}
{
"status": true,
"message": "SUCCESS",
"data": {
"order_id": "INV-20260720-001",
"amount": 50500,
"requested_amount": 50000,
"markup_fee": 500,
"customer_name": "Budi Santoso",
"customer_phone": "081234567890",
"payment_method": "QRIS",
"qris_string": "00020101021226670016ID.CO.QRIS...",
"qris_image_url": "https://bkent.web.id/api/v1/qr-image.php?data=...",
"expired_at": "2026-07-20 14:45:25",
"expires_in": 300
}
}
amount = nominal yang benar-benar di-charge ke customer (sudah termasuk markup fee toko Anda kalau diatur). requested_amount = nominal murni yang Anda minta lewat amount di request.
Virtual Account bank — pelanggan transfer manual ke nomor VA yang di-generate. Kadaluarsa dalam 30 menit (lebih longgar dari QRIS karena transfer manual butuh waktu). Field channel wajib diisi salah satu kode bank di Referensi Kode Bank & Channel.
{
"order_id": "INV-20260720-002",
"amount": 75000,
"payment_method": "VA",
"channel": "BCA",
"customer_name": "Budi Santoso",
"customer_phone": "081234567890"
}
{
"status": true,
"message": "SUCCESS",
"data": {
"order_id": "INV-20260720-002",
"amount": 75000,
"requested_amount": 75000,
"markup_fee": 0,
"customer_name": "Budi Santoso",
"customer_phone": "081234567890",
"payment_method": "VA",
"channel": "BCA",
"bank_name": "BCA",
"va_number": "1604085700164247",
"expired_at": "2026-07-20 15:05:25",
"expires_in": 1800
}
}
Pembayaran langsung lewat aplikasi DANA pelanggan. Kadaluarsa dalam 15 menit. Tidak butuh field tambahan selain payment_method.
{
"order_id": "INV-20260720-003",
"amount": 30000,
"payment_method": "DANA",
"customer_name": "Budi Santoso",
"customer_phone": "081234567890"
}
{
"status": true,
"message": "SUCCESS",
"data": {
"order_id": "INV-20260720-003",
"amount": 30000,
"requested_amount": 30000,
"markup_fee": 0,
"customer_name": "Budi Santoso",
"customer_phone": "081234567890",
"payment_method": "DANA",
"dana_deeplink": "https://m.dana.id/n/link/minta?full_url=...",
"dana_qr_image_url": "https://bkent.web.id/api/v1/qr-image.php?data=...",
"expired_at": "2026-07-20 14:55:25",
"expires_in": 900
}
}
{
"status": false,
"message": "Terjadi kesalahan sistem saat membuat tagihan pembayaran. Silakan coba lagi."
}
Endpoint: /withdraw.aspx
Digunakan untuk menarik saldo aktif dari akun merchant ke rekening bank atau e-wallet tujuan.
bank_code + account_number, atau saved_account_id) harus sudah terdaftar lebih dulu lewat menu "Rekening Tersimpan" di dashboard. Ini validasi keamanan wajib — request ke rekening yang belum terdaftar akan selalu ditolak, walau data yang dikirim benar formatnya. Kalau API key/sesi Anda bocor, penyerang tetap tidak bisa mencairkan dana ke rekening sembarang.| FIELD | TYPE | REQ | DESCRIPTION |
|---|---|---|---|
| amount | integer | Y | Nominal bersih yang diterima (Minimal Rp 10.000 via Bank/BI FAST, Rp 25.000 via E-Wallet/RTOL). |
| saved_account_id | integer | Y* | ID rekening tersimpan (cara direkomendasikan — lihat ID-nya di menu "Rekening Tersimpan"). Kalau diisi, field bank_code/account_number di bawah diabaikan. |
| bank_code | string | Y* | Alternatif dari saved_account_id. Kode bank/e-wallet tujuan — lihat tabel referensi. Tetap harus sudah terdaftar di "Rekening Tersimpan". |
| account_number | string | Y* | Wajib kalau pakai bank_code (bukan saved_account_id). Nomor rekening / No. HP e-wallet tujuan. |
| account_name | string | N | Nama pemilik rekening (opsional, hanya untuk catatan — validasi tetap berdasarkan bank_code+account_number). |
| type | integer | N | 1 = BI FAST (bank, real-time), 2 = RTOL (e-wallet/real-time transfer). Otomatis jadi 2 kalau bank_code yang dipilih adalah e-wallet. Default: 1. |
Y* = wajib pilih salah satu: saved_account_id ATAU pasangan bank_code+account_number.
{
"amount": 50000,
"saved_account_id": 1,
"type": 1
}
{
"amount": 50000,
"bank_code": "014",
"account_number": "5749474996",
"account_name": "Bobin",
"type": 1
}
{
"status": true,
"message": "Permintaan penarikan sedang diproses, dana akan diterima ... sesaat lagi.",
"data": {
"trx_id": "WD20260729001952357",
"status": "PENDING",
"amount": 50000
}
}
Status akhir (SUCCESS/FAILED) belum tersedia lewat endpoint API saat ini — pantau lewat menu "Riwayat Penarikan" di dashboard. Kalau gagal, saldo otomatis dikembalikan.
{
"status": false,
"message": "Rekening/e-wallet tujuan belum terdaftar di akun Anda. Tambahkan dulu lewat menu Rekening Tersimpan sebelum melakukan penarikan."
}
Endpoint: /check-status.aspx
Digunakan untuk memeriksa status pembayaran transaksi Anda secara manual (Jika webhook gagal diterima).
{
"order_id": "INV-20260720-001"
}
{
"status": true,
"message": "Detail transaksi",
"data": {
"order_id": "INV-20260720-001",
"amount": 50000,
"fee_amount": 850,
"net_amount": 49150,
"payment_method": "QRIS",
"customer_name": "dartonosapok",
"customer_phone": "",
"status": "SUCCESS",
"paid_at": "2026-07-27 20:53:04",
"expired_at": "2026-07-27 20:57:30",
"created_at": "2026-07-27 20:52:30",
"qris_string": "00020101021226670016ID.CO.QRIS...",
"qris_image_url": "https://bkent.web.id/api/v1/qr-image.php?data=..."
}
}
payment_method akan bernilai QRIS, VA, atau DANA sesuai metode yang dipakai saat generate. Nilai status: PENDING, SUCCESS, atau EXPIRED.
Detail pembayaran (qris_string/va_number/dana_deeplink, sesuai payment_method-nya) ikut dikembalikan lagi di sini kalau tersedia — berguna kalau Anda kehilangan response awal dari /generate.aspx dan customer masih perlu bayar. Tidak muncul untuk transaksi lama yang dibuat sebelum fitur ini aktif.
Endpoint: /check-balance.aspx
Digunakan untuk memeriksa informasi saldo aktif dan tertunda milik merchant secara real-time.
Kalau Anda punya lebih dari satu Toko (lihat menu "Toko"), masing-masing toko punya API Key sendiri dan saldonya terpisah — pakai API Key toko yang bersangkutan untuk cek saldo toko itu. Response selalu menyertakan object store supaya Anda tahu persis balance ini kepunyaan akun/toko yang mana, tanpa perlu menyimpan mapping key↔toko sendiri.
curl -X GET https://bkent.web.id/api/v1/check-balance.aspx \ -H "Authorization: Bearer NG-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Tidak ada body/payload JSON yang perlu dikirim — cukup header Authorization di atas (ganti placeholder dengan API Key asli Anda), itu sudah cukup buat sistem tahu toko/akun mana yang minta dicek saldonya. Endpoint ini juga menerima method POST kalau library HTTP Anda lebih mudah pakai itu (body boleh kosong / {}).
{
"status": true,
"message": "Informasi saldo",
"data": {
"active_balance": 1081300,
"pending_balance": 0,
"currency": "IDR",
"store": {
"id": 5,
"name": "Toko Kopi Kenangan",
"type": "toko"
}
}
}
store.type bernilai pusat kalau API Key yang dipakai adalah akun utama Anda, atau toko kalau API Key milik salah satu Toko.
Endpoint: /check-mutasi.aspx
Digunakan untuk menarik riwayat transaksi/mutasi pembayaran masuk (payin) dengan sistem pagination dan filter status opsional. Riwayat penarikan (withdraw) tidak termasuk di endpoint ini — cek lewat menu "Riwayat Penarikan" di dashboard.
{
"limit": 10, // Maksimal 100 data per halaman
"page": 1,
"status": "SUCCESS" // Opsional: SUCCESS, PENDING, atau EXPIRED
}
{
"status": true,
"message": "Data mutasi berhasil diambil",
"pagination": {
"current_page": 1,
"limit": 10,
"total_data": 45,
"total_pages": 5
},
"data": [
{
"order_id": "DP-1785160350-758",
"amount": 50000,
"fee_amount": 850,
"net_amount": 49150,
"payment_method": "QRIS",
"customer_name": "dartonosapok",
"customer_phone": "",
"status": "SUCCESS",
"paid_at": "2026-07-27 20:53:04",
"created_at": "2026-07-27 20:52:30"
}
]
}
Ada dua sistem kode berbeda di API ini — dipakai untuk tujuan yang berbeda, jangan tertukar:
bank_code saat withdraw)Kode internal sistem kami — dipakai saat menyimpan rekening di "Rekening Tersimpan" dan saat withdraw manual (tanpa saved_account_id).
| CODE | NAMA | TIPE |
|---|---|---|
| 014 | Bank BCA | Bank |
| 008 | Bank Mandiri | Bank |
| 002 | Bank BRI | Bank |
| 009 | Bank BNI | Bank |
| 451 | BSI (Bank Syariah Indonesia) | Bank |
| 013 | Bank Permata | Bank |
| 022 | Bank CIMB Niaga | Bank |
| 731 | DANA | E-Wallet |
| 501 | OVO | E-Wallet |
| 503 | GoPay | E-Wallet |
| 502 | ShopeePay | E-Wallet |
| 504 | LinkAja | E-Wallet |
channel saat generate payment_method=VA)Kode bank tujuan Virtual Account yang di-generate untuk menerima pembayaran masuk — beda sistem dari kode withdraw di atas.
| CHANNEL | NAMA BANK |
|---|---|
| BCA | Bank BCA |
| MANDIRI | Bank Mandiri |
| BNI | Bank BNI 46 |
| BSI | Bank Syariah Indonesia |
| PERMATA | Bank Permata |
| CIMB | Bank CIMB Niaga |
| DANAMON | Bank Danamon |
| OCBC | Bank OCBC NISP |
| HANA | Bank Hana |
Sistem kami mengirimkan notifikasi instan lewat 2 URL callback terpisah yang Anda atur sendiri di menu Pengaturan (akun pusat) atau Detail Toko (per-toko): URL Callback (Webhook Deposit) untuk pembayaran masuk (QRIS/VA/DANA), dan URL Callback Withdraw (Webhook Payout) untuk status penarikan. Keduanya opsional dan independen — bisa diisi salah satu, keduanya, atau dikosongkan. Pastikan endpoint Anda dapat menerima HTTP POST dengan format JSON, dan membalas dengan HTTP 200.
{
"data": {
"transaction_id": "INV-20260720-001",
"status": "SUCCESS",
"amount": 50000,
"net_amount": 49150,
"type": "QRIS"
},
"success": true
}
| FIELD | DESCRIPTION |
|---|---|
| success | Selalu bernilai true jika transaksi berhasil. |
| data.transaction_id | Merupakan order_id yang Anda kirimkan saat request generate. |
| data.amount | Nominal total yang dibayar customer (termasuk markup fee kalau ada). |
| data.net_amount | Nominal bersih yang masuk ke saldo Anda setelah potongan MDR. |
| data.type | Metode pembayaran yang dipakai: QRIS, VA, atau DANA. |
<?php $json = file_get_contents('php://input'); $callback = json_decode($json, true); if (isset($callback['success']) && $callback['success'] === true) { $order_id = $callback['data']['transaction_id']; $net_amount = $callback['data']['net_amount']; // 1. Cek di database Anda apakah order_id valid dan berstatus PENDING // 2. Update status transaksi di database Anda menjadi PAID/SUCCESS // 3. Top up saldo user/proses layanan echo json_encode(["status" => "ok"]); // Wajib balas 200 OK } else { echo json_encode(["status" => "failed"]); } ?>
Dikirim ke URL Callback Withdraw Anda tiap kali status penarikan final (SUCCESS atau FAILED) — biasanya beberapa saat setelah request /withdraw.aspx Anda direspons PENDING. Kalau URL ini tidak diisi, tidak ada yang dikirim (silent, tidak error) — pantau manual lewat menu "Riwayat Penarikan" sebagai alternatif.
{
"data": {
"trx_id": "WD20260729001952357",
"status": "SUCCESS",
"amount": 50000,
"admin_fee": 3650,
"total_deduction": 53650
},
"success": true
}
status bernilai SUCCESS atau FAILED — kalau FAILED, saldo Anda sudah otomatis dikembalikan sebesar total_deduction di sisi kami, tidak perlu tindakan tambahan dari Anda selain mencatat kegagalannya. trx_id sama dengan yang dikembalikan saat request withdraw awal.
Untuk menjaga stabilitas sistem, endpoint berikut dibatasi jumlah request per menit. Kalau kena limit, Anda akan menerima HTTP 429.
| ENDPOINT | LIMIT |
|---|---|
| /generate.aspx | 60 request / menit / API Key |
| /withdraw.aspx | 10 request / menit / akun merchant |
| /check-status.aspx | 60 request / menit / akun merchant |
| /check-balance.aspx | 60 request / menit / akun merchant |
| /check-mutasi.aspx | 60 request / menit / akun merchant |
{
"status": false,
"message": "Terlalu banyak percobaan. Coba lagi beberapa saat lagi."
}
Semua response error di seluruh endpoint API ini selalu punya bentuk yang sama: {"status": false, "message": "..."}. Cukup cek status untuk tahu sukses/gagal, lalu tampilkan message ke user Anda — jangan bergantung ke isi teks message persis untuk logic program (teksnya bisa disempurnakan sewaktu-waktu), pakai HTTP status code di bawah buat logic-nya.
| HTTP CODE | ARTI | CONTOH PESAN | ENDPOINT |
|---|---|---|---|
| 400 | Bad Request — input tidak lengkap/tidak valid. | "order_id wajib diisi dan amount minimal Rp 10.000.", "Format JSON tidak valid atau kosong.", "Nominal penarikan kurang dari minimal.", "Rekening/e-wallet tujuan belum terdaftar di akun Anda.", "Parameter channel wajib diisi & valid untuk payment_method VA." | Semua endpoint POST |
| 401 | Unauthorized — API Key kosong/salah. | "Header Authorization wajib diisi.", "API Key tidak valid.", "Akses ditolak. Sesi Anda telah berakhir atau API Key tidak valid." | Semua endpoint |
| 403 | Forbidden — IP pemanggil belum terdaftar di Whitelist. | "Akses ditolak: IP Anda (x.x.x.x) belum di-whitelist di database." | /generate.aspx, /check-status.aspx, /check-balance.aspx, /check-mutasi.aspx |
| 404 | Data yang diminta tidak ditemukan. | "Transaksi tidak ditemukan" | /check-status.aspx |
| 405 | Method HTTP salah (Anda pakai GET padahal harus POST, dst). | "Method hanya boleh POST.", "Gunakan metode POST atau GET" | Semua endpoint |
| 429 | Too Many Requests — kena rate limit (lihat section Rate Limit). | "Terlalu banyak percobaan. Coba lagi beberapa saat lagi." | /generate.aspx, /withdraw.aspx, /check-status.aspx, /check-balance.aspx, /check-mutasi.aspx |
| 500 | Kesalahan internal server kami, atau provider pembayaran bermasalah. Coba lagi setelah beberapa saat; kalau berulang, hubungi kami. | "Terjadi kesalahan sistem saat membuat tagihan pembayaran. Silakan coba lagi.", "Terjadi kesalahan sistem saat mengambil saldo. Silakan coba lagi." | Semua endpoint |
| 502 | Payout ke provider pembayaran gagal diproses. Saldo Anda TIDAK terpotong — aman untuk dicoba lagi. | "Penarikan gagal diproses oleh sistem pembayaran. Silakan coba lagi beberapa saat lagi, atau hubungi admin kalau masalah berlanjut." | /withdraw.aspx |
status === true dulu untuk jalur sukses. Kalau false, cabang berdasarkan HTTP status code (401/403 = ada yang salah di konfigurasi Anda, benerin sekali lalu jangan retry otomatis; 429 = tunggu lalu retry; 500/502 = boleh retry dengan jeda; 400/404 = ada yang salah di data yang Anda kirim, jangan retry sebelum diperbaiki).