Dokumentasi API

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.

Quick Start — Integrasi Pertama Anda (5 Menit)

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.

1. Daftarkan IP server Anda di menu Whitelist pada dashboard (WAJIB — request dari IP yang belum terdaftar selalu ditolak).
2. Daftarkan minimal 1 rekening/e-wallet tujuan di menu Rekening Tersimpan (WAJIB sebelum bisa withdraw — lihat alasannya di section Withdraw).
3. Coba request pertama Anda pakai contoh cURL di bawah (ganti API Key placeholder dengan API Key asli Anda).
4. Atur URL Webhook Anda di menu Pengaturan buat mulai terima notifikasi otomatis (lihat section Webhook).

CONTOH — Generate QRIS Rp 10.000 (cURL)

Terminal
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.

Getting Started & Otentikasi

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.

HTTP HEADERS

Request Headers
Content-Type: application/json
Authorization: Bearer [API_KEY_ANDA_DISINI]
BASE URL API
https://bkent.web.id/api/v1
PHP Wrapper Class (SDK)

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.

POST Generate Pembayaran

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.

Catatan untuk VA: nomor Virtual Account yang dihasilkan selalu valid dan bisa langsung dibayar. Yang masih dalam konfirmasi ke provider: apakah field 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.

REQUEST BODY

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).

payment_method: QRIS

Berlaku instan, kadaluarsa dalam 5 menit. Response berisi string QRIS mentah + URL gambar QR siap ditampilkan.

SAMPLE REQUEST

Request Payload (JSON)
{
  "order_id": "INV-20260720-001",
  "amount": 50000,
  "payment_method": "QRIS",
  "customer_name": "Budi Santoso",
  "customer_phone": "081234567890"
}

SAMPLE RESPONSE (SUCCESS)

Response Body
{
  "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.

payment_method: VA

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.

SAMPLE REQUEST

Request Payload (JSON)
{
  "order_id": "INV-20260720-002",
  "amount": 75000,
  "payment_method": "VA",
  "channel": "BCA",
  "customer_name": "Budi Santoso",
  "customer_phone": "081234567890"
}

SAMPLE RESPONSE (SUCCESS)

Response Body
{
  "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
  }
}

payment_method: DANA

Pembayaran langsung lewat aplikasi DANA pelanggan. Kadaluarsa dalam 15 menit. Tidak butuh field tambahan selain payment_method.

SAMPLE REQUEST

Request Payload (JSON)
{
  "order_id": "INV-20260720-003",
  "amount": 30000,
  "payment_method": "DANA",
  "customer_name": "Budi Santoso",
  "customer_phone": "081234567890"
}

SAMPLE RESPONSE (SUCCESS)

Response Body
{
  "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
  }
}

RESPONSE (ERROR)

Response Body — Gagal
{
  "status": false,
  "message": "Terjadi kesalahan sistem saat membuat tagihan pembayaran. Silakan coba lagi."
}
POST Withdraw / Penarikan

Endpoint: /withdraw.aspx

Digunakan untuk menarik saldo aktif dari akun merchant ke rekening bank atau e-wallet tujuan.

WAJIB dibaca: rekening/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.

REQUEST BODY

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.

SAMPLE REQUEST — pakai saved_account_id (direkomendasikan)

Request Payload (JSON)
{
  "amount": 50000,
  "saved_account_id": 1,
  "type": 1
}

SAMPLE REQUEST — pakai bank_code manual

Request Payload (JSON)
{
  "amount": 50000,
  "bank_code": "014",
  "account_number": "5749474996",
  "account_name": "Bobin",
  "type": 1
}

RESPONSE (SUCCESS / PENDING)

Response Body
{
  "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.

RESPONSE (GAGAL — contoh: rekening belum terdaftar)

Response Body — Gagal
{
  "status": false,
  "message": "Rekening/e-wallet tujuan belum terdaftar di akun Anda. Tambahkan dulu lewat menu Rekening Tersimpan sebelum melakukan penarikan."
}
POST Check Status

Endpoint: /check-status.aspx

Digunakan untuk memeriksa status pembayaran transaksi Anda secara manual (Jika webhook gagal diterima).

SAMPLE REQUEST JSON

Request Payload (JSON)
{
  "order_id": "INV-20260720-001"
}

RESPONSE (SUCCESS)

Response Body
{
  "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.

POST/GET Check Balance

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.

SAMPLE REQUEST (cURL)

Terminal
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 / {}).

RESPONSE (SUCCESS)

Response Body
{
  "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.

POST/GET Check Mutasi

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.

SAMPLE REQUEST JSON

Request Payload (JSON)
{
  "limit": 10, // Maksimal 100 data per halaman
  "page": 1,
  "status": "SUCCESS" // Opsional: SUCCESS, PENDING, atau EXPIRED
}

RESPONSE (SUCCESS)

Response Body
{
  "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"
    }
  ]
}
Referensi Kode Bank & Channel

Ada dua sistem kode berbeda di API ini — dipakai untuk tujuan yang berbeda, jangan tertukar:

1. Kode tujuan Withdraw (dipakai di bank_code saat withdraw)

Kode internal sistem kami — dipakai saat menyimpan rekening di "Rekening Tersimpan" dan saat withdraw manual (tanpa saved_account_id).

CODENAMATIPE
014Bank BCABank
008Bank MandiriBank
002Bank BRIBank
009Bank BNIBank
451BSI (Bank Syariah Indonesia)Bank
013Bank PermataBank
022Bank CIMB NiagaBank
731DANAE-Wallet
501OVOE-Wallet
503GoPayE-Wallet
502ShopeePayE-Wallet
504LinkAjaE-Wallet

2. Kode channel Generate VA (dipakai di 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.

CHANNELNAMA BANK
BCABank BCA
MANDIRIBank Mandiri
BNIBank BNI 46
BSIBank Syariah Indonesia
PERMATABank Permata
CIMBBank CIMB Niaga
DANAMONBank Danamon
OCBCBank OCBC NISP
HANABank Hana
Butuh bank lain yang belum ada di daftar VA di atas (bank daerah/BPD/syariah)? Hubungi kami untuk ditambahkan.
Callback Handling (Webhook) HTTP POST

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.

CALLBACK JSON PAYLOAD (PEMBAYARAN SUKSES)

Request Payload (JSON)
{
  "data": {
    "transaction_id": "INV-20260720-001",
    "status": "SUCCESS",
    "amount": 50000,
    "net_amount": 49150,
    "type": "QRIS"
  },
  "success": true
}

FIELD DEFINITIONS

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.

Contoh Penerimaan (PHP)

PHP Implementation Example
<?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"]);
}
?>

Webhook Payout (Status Penarikan)

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.

CALLBACK JSON PAYLOAD (WITHDRAW)

Request Payload (JSON)
{
  "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.

Rate Limit

Untuk menjaga stabilitas sistem, endpoint berikut dibatasi jumlah request per menit. Kalau kena limit, Anda akan menerima HTTP 429.

ENDPOINTLIMIT
/generate.aspx60 request / menit / API Key
/withdraw.aspx10 request / menit / akun merchant
/check-status.aspx60 request / menit / akun merchant
/check-balance.aspx60 request / menit / akun merchant
/check-mutasi.aspx60 request / menit / akun merchant

RESPONSE (429)

Response Body
{
  "status": false,
  "message": "Terlalu banyak percobaan. Coba lagi beberapa saat lagi."
}
Referensi Error Code

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 CODEARTICONTOH PESANENDPOINT
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
Saran penanganan error di kode Anda: cek 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).

Siap mulai integrasi?

Daftar gratis, API Key aktif begitu akun dibuat.

Buat Akun Gratis