Dokumentasi API
API JSON untuk mengambil transaksi QRIS dan membuat QRIS dinamis dari sistem lain (server cabang, kasir, aplikasi). Butuh penjelasan santai non-teknis? Lihat Panduan.
Konsep singkat
1
Pusat menarik transaksi. Service ini login ke QRIS BCA lalu polling transaksi otomatis dan menyimpannya.
2
Cabang mengambil data. Sistem lain memanggil endpoint di bawah pakai API key. Key cabang di-scope ke outlet (mid)-nya sendiri; nomor kartu pembayar disamarkan.
3
Realtime. Tak perlu polling terus β pakai SSE (
/api/stream) atau daftarkan webhook untuk didorong saat ada transaksi/invoice lunas.4
QRIS dinamis. Cabang kirim nominal β dapat QR + invoice. Pusat mengunci nominal unik (base + Rp1β100 acak) sehingga tiap pembayaran otomatis cocok ke invoice-nya (tidak tertukar, tidak double).
Autentikasi
Kirim header X-API-Key: <key> pada semua /api/* kecuali /api/health dan /api. Untuk SSE (EventSource tak bisa set header) pakai query ?api_key=<key>.
- Admin key (dari
.env) β lihat semua outlet, data penuh. - Key cabang (di
apikeys.json) β hanya outlet miliknya, PAN tersamar; minta mid lain β403.
Indeks endpoint mesin: /api. Masukkan API key di kanan atas untuk mencoba langsung ("Try it").
Endpoint
Field transaksi
| field | contoh | keterangan |
|---|---|---|
| date | 08 Agu 2026 11:26:14 WIB | waktu (WIB) |
| amount | 1255 | nominal (Rp) |
| payer_name / issuer_name | **MA INDR**AN ***ILO / BANK MANDIRI | pembayar (tersamar) & bank |
| reference_number / trace_number / approval_code | 608488910502 / 21157 / 851452 | identifier transaksi |
| mid / qris_nmid / tid | 001699394 / ID2022204392031 / A01 | id merchant / QR / terminal |
| cpan / mpan | 9360β¦391 / 9360β¦941 | PAN pembayar / merchant (tersamar utk cabang) |
| _ts | 1786188374000 | timestamp numerik β bisa dipakai lagi sebagai since |
Contoh integrasi
Node.js β ambil transaksi cabang hari ini:
const r = await fetch(`${BASE}/api/transactions?mid=001699394&from=2026-08-08&to=2026-08-08`, {
headers: { 'X-API-Key': process.env.QRIS_API_KEY }
});
const { transactions } = await r.json();
Verifikasi webhook (HMAC-SHA256):
const sig='sha256='+crypto.createHmac('sha256',SECRET).update(rawBody).digest('hex');
if(sig!==req.headers['x-signature']) return res.sendStatus(401);