Cek mutasi dari banyak aplikasi
Admin membuka aplikasi merchant satu per satu untuk memastikan uang pembeli sudah masuk.
Upload QRIS milik Anda, dapat API key, lalu buat QRIS dinamis untuk website, aplikasi, atau chatbot. Pembayaran dicek otomatis dan dana langsung masuk ke rekening Anda, tanpa fee dari kami.
POST /webhook/qris event: invoice.paid signature: valid ✓ ← 200 OK Hubungkan QRIS merchant dari bank dan e-wallet yang Anda pakai
Kalau Anda jualan lewat website, chatbot, atau marketplace sendiri, situasi ini mungkin terdengar akrab.
Admin membuka aplikasi merchant satu per satu untuk memastikan uang pembeli sudah masuk.
Pembeli mengetik nominal sendiri, kurang atau lebih sedikit saja bikin rekap kacau.
Pesanan tetap "menunggu" sampai admin mengubahnya, pembeli malam hari harus menunggu pagi.
Uang mengendap di pihak ketiga, dicairkan belakangan dengan potongan per transaksi.
Jawaban singkatAPI QRIS adalah layanan yang membuat kode QRIS bernominal secara otomatis dan memberi tahu sistem Anda saat pembayaran masuk. Dengan APIQris, QRIS API itu memakai QRIS milik Anda sendiri, jadi dana tidak pernah lewat pihak ketiga.
QRIS statis yang biasa ditempel di kasir mengharuskan pembeli mengetik nominal dan penjual mengecek mutasi secara manual. Begitu penjualan pindah ke website atau WhatsApp, cara itu jadi lambat dan rawan salah.
APIQris menambahkan nominal ke QRIS Anda, memberi kode unik di setiap tagihan, lalu membaca notifikasi dana masuk dari aplikasi merchant di HP Anda. Hasilnya: pesanan berubah lunas sendiri, siang maupun malam.
POST /invoices Tidak perlu membuka akun payment gateway baru. Cukup QRIS yang sudah Anda punya dan satu HP Android. Lihat cara kerja lengkap →
Buat akun APIQris dengan email, tanpa biaya dan tanpa dokumen perusahaan.
Unggah gambar QRIS merchant dari bank atau e-wallet Anda. Sistem membaca data QRIS secara otomatis.
Pasang aplikasi APIQris di HP Android yang menerima notifikasi dana masuk, lalu pindai kode pairing.
Salin API key, buat tagihan QRIS dinamis dari website atau chatbot, dan terima webhook saat lunas.
Dari pembuatan QRIS dinamis sampai webhook, dirancang supaya integrasi selesai dalam satu sore. Lihat semua fitur →
Satu panggilan API mengubah QRIS statis Anda menjadi QRIS bernominal untuk setiap pesanan.
Pelajari →Kirim ulang otomatis 6x bila server Anda gagal membalas.
Deteksi otomatisTanpa saldo mengendap, tanpa jadwal pencairan.
Dua pesanan Rp50.000 tetap tercocokkan tepat.
Kirim QR di WhatsApp/Telegram, bot kirim pesanan.
Tanpa coding, bagikan link bayar bernominal.
Pilih QRIS per toko atau cabang.
Simulasi bayar tanpa uang sungguhan.
Pakai QRIS merchant dari bank atau e-wallet mana pun. Selama aplikasinya mengirim notifikasi dana masuk, pembayaran ke QRIS itu bisa dicek otomatis. Pembeli pun bebas bayar dari aplikasi apa saja.
Pilih sistem yang Anda pakai, kami tunjukkan cara integrasi API QRIS yang paling pas.
Buat tagihan dari backend, tampilkan QR di halaman checkout Anda, terima webhook saat lunas.
Lihat panduannya →Bot memanggil API, mengirim QR ke chat, lalu membalas otomatis saat webhook lunas masuk.
Lihat panduannya →Pasang plugin, isi API key. Pesanan berubah Processing otomatis setelah dibayar.
Lihat panduannya →Invoice dibayar QRIS dan layanan pelanggan aktif sendiri tanpa admin.
Lihat panduannya →Tampilkan QR bernominal di layar kasir, transaksi tertutup otomatis saat lunas.
Lihat panduannya →Buat link bayar dari dashboard, bagikan ke pembeli lewat chat atau media sosial.
Lihat panduannya →Keduanya bisa membuat QRIS dinamis. Bedanya ada di siapa yang memegang uang Anda.
| Aspek | APIQris | Payment gateway umum |
|---|---|---|
| Penerima dana | QRIS & rekening Anda sendiri | Rekening payment gateway, lalu dicairkan |
| Potongan per transaksi | Rp0 dari APIQris | Umumnya 0,7% atau lebih + biaya tarik |
| Waktu dana tersedia | Sesuai penyedia QRIS Anda | Menunggu jadwal pencairan |
| Syarat daftar | Email + QRIS merchant | Sering butuh dokumen badan usaha |
| QRIS dinamis via API | Ya | Ya |
| Webhook otomatis | Ya, HMAC SHA-256 | Ya |
| Butuh HP Android pendeteksi | Ya, satu HP merchant | Tidak |
| Risiko dana tertahan | Tidak ada, dana tidak lewat kami | Ada, bila akun ditinjau atau dibekukan |
Website, chatbot, plugin, atau kasir: pola integrasinya sama.
QRIS bernominal tampil di layar kasir, status lunas masuk sendiri ke sistem POS.
Developer & AgencySatu modul untuk semua proyek. Klien upload QRIS sendiri, dana langsung ke rekening klien.
Multi toko & cabangSetiap cabang pakai QRIS-nya sendiri, laporan transaksi terpusat dan bisa diekspor.
Kiosk & IoTLaundry koin, vending machine, atau loket parkir: mesin jalan setelah webhook lunas.
Aplikasi pendamping APIQris membaca notifikasi dana masuk dari aplikasi merchant, lalu meneruskannya ke server kami untuk dicocokkan.
Pantau omzet, status tagihan, dan riwayat webhook dari semua toko dan QRIS Anda.
Kirim nominal dan order ID, terima string QRIS, URL gambar QR, dan total yang sudah ditambah kode unik. Tampilkan ke pembeli, selesai.
curl -X POST https://api.apiqris.com/v1/invoices \
-H "Authorization: Bearer AQ_LIVE_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"amount":50000,"order_id":"INV-1024"}'<?php
$ch = curl_init('https://api.apiqris.com/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('APIQRIS_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'amount' => 50000,
'order_id' => 'INV-1024',
]),
]);
$qris = json_decode(curl_exec($ch), true);
echo $qris['qr_image_url']; // tampilkan ke pembeliuse Illuminate\Support\Facades\Http;
$qris = Http::withToken(config('services.apiqris.key'))
->post('https://api.apiqris.com/v1/invoices', [
'amount' => $order->total,
'order_id' => $order->number,
])
->throw()
->json();
return view('checkout.qris', ['qris' => $qris]);const res = await fetch('https://api.apiqris.com/v1/invoices', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.APIQRIS_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ amount: 50000, order_id: 'INV-1024' }),
});
const qris = await res.json();
console.log(qris.total_amount, qris.qr_image_url);import os, requests
r = requests.post(
"https://api.apiqris.com/v1/invoices",
headers={"Authorization": f"Bearer {os.environ['APIQRIS_KEY']}"},
json={"amount": 50000, "order_id": "INV-1024"},
timeout=15,
)
r.raise_for_status()
qris = r.json()
print(qris["total_amount"], qris["qr_image_url"])body := strings.NewReader(`{"amount":50000,"order_id":"INV-1024"}`)
req, _ := http.NewRequest("POST", "https://api.apiqris.com/v1/invoices", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("APIQRIS_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()Setiap callback membawa tanda tangan HMAC SHA-256. Verifikasi, tandai pesanan lunas, balas 200. Gagal? Kami kirim ulang otomatis.
<?php
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $_SERVER['HTTP_X_APIQRIS_SIGNATURE'] ?? ''), $sig);
$expected = hash_hmac('sha256', $sig['t'] . '.' . $body, getenv('APIQRIS_SECRET'));
if (!hash_equals($expected, $sig['v1'] ?? '') || abs(time() - (int) $sig['t']) > 300) {
http_response_code(401);
exit;
}
$event = json_decode($body, true);
if ($event['event'] === 'invoice.paid') {
tandai_lunas($event['order_id']); // fungsi milik aplikasi Anda
}
http_response_code(200);import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.post('/webhook/qris', express.raw({ type: 'application/json' }), (req, res) => {
const sig = Object.fromEntries(req.get('X-APIQris-Signature').split(',').map((p) => p.split('=')));
const expected = crypto.createHmac('sha256', process.env.APIQRIS_SECRET)
.update(`${sig.t}.${req.body}`).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig.v1 ?? ''))) return res.sendStatus(401);
const event = JSON.parse(req.body);
if (event.event === 'invoice.paid') markPaid(event.order_id);
res.sendStatus(200);
});import hmac, hashlib, os
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/webhook/qris")
def webhook():
sig = dict(p.split("=", 1) for p in request.headers["X-APIQris-Signature"].split(","))
msg = f"{sig['t']}.".encode() + request.get_data()
expected = hmac.new(os.environ["APIQRIS_SECRET"].encode(), msg, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, sig.get("v1", "")):
abort(401)
event = request.get_json()
if event["event"] == "invoice.paid":
mark_paid(event["order_id"])
return "", 200Route::post('/webhook/qris', function (Request $request) {
parse_str(str_replace(',', '&', $request->header('X-APIQris-Signature')), $sig);
$expected = hash_hmac('sha256', $sig['t'].'.'.$request->getContent(), config('services.apiqris.secret'));
abort_unless(hash_equals($expected, $sig['v1'] ?? ''), 401);
if ($request->input('event') === 'invoice.paid') {
Order::where('number', $request->input('order_id'))->update(['status' => 'paid']);
}
return response()->noContent();
});func webhook(w http.ResponseWriter, r *http.Request) {
body, _ := io.ReadAll(r.Body)
sig := map[string]string{}
for _, p := range strings.Split(r.Header.Get("X-APIQris-Signature"), ",") {
if k, v, ok := strings.Cut(p, "="); ok {
sig[k] = v
}
}
mac := hmac.New(sha256.New, []byte(os.Getenv("APIQRIS_SECRET")))
mac.Write([]byte(sig["t"] + "." + string(body)))
if !hmac.Equal([]byte(hex.EncodeToString(mac.Sum(nil))), []byte(sig["v1"])) {
http.Error(w, "invalid signature", http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusOK)
}# Header yang dikirim APIQris ke callback_url Anda
X-APIQris-Signature: t=1760670000,v1=5f2b...e9
Content-Type: application/json
{"event":"invoice.paid","id":"qr_9KX2T7","order_id":"INV-1024","total_amount":50123,"status":"paid"}Daftar gratis, fitur inti gratis. Kami tidak menampung dana, jadi tidak ada alasan memotong persentase dari omzet Anda. Rincian harga & simulasi →
MDR dari bank atau e-wallet penerbit QRIS Anda (bila ada) tetap mengikuti ketentuan penyedia tersebut.
Ilustrasi potongan biaya perantara
APIQris tidak pernah meminta password bank, PIN, atau OTP Anda.
Data tagihan dan API key selalu terenkripsi saat dikirim.
Kunci bocor? Buat kunci baru dari dashboard, kunci lama langsung mati.
Setiap callback ditandatangani agar server Anda bisa menolak yang palsu.
Tidak ada saldo yang bisa dibekukan, karena uang langsung ke QRIS Anda.
Tambahkan QRIS ke aplikasi tanpa membangun sistem verifikasi manual.
Kumpulkan iuran, biaya kelas, atau registrasi dengan status yang rapi.
Terima pesanan tanpa cek rekening atau minta screenshot bukti bayar.
Pilih bahasa pemrograman, platform, atau penyedia QRIS yang Anda pakai.
API QRIS adalah antarmuka pemrograman yang memungkinkan website, aplikasi, atau chatbot membuat QRIS bernominal secara otomatis dan menerima kabar ketika QRIS tersebut sudah dibayar.
Payment gateway menampung dana lalu mencairkannya dengan potongan biaya. APIQris memakai QRIS milik Anda sendiri sehingga dana langsung masuk ke rekening Anda, dan APIQris tidak memotong fee per transaksi.
Ya, daftar gratis dan APIQris tidak memotong persentase transaksi. Potongan MDR dari bank atau e-wallet penerbit QRIS Anda (bila ada) tetap mengikuti ketentuan penyedia tersebut.
QRIS merchant resmi dari bank atau e-wallet, seperti GoPay Merchant, ShopeePay, DANA Bisnis, BRI, BCA, Mandiri Livin’ Merchant, dan lainnya, selama aplikasinya menampilkan notifikasi dana masuk berisi nominal.
Aplikasi pendamping APIQris di HP Android Anda membaca notifikasi dana masuk dari aplikasi merchant, lalu mengirim nominalnya ke server kami untuk dicocokkan dengan tagihan yang menunggu.
Tidak. APIQris tidak pernah meminta password internet banking, PIN, atau OTP Anda.
Bisa. Bot cukup memanggil API untuk membuat tagihan, mengirim gambar QR ke pengguna, lalu menerima webhook saat pembayaran lunas.
Semua bahasa yang bisa melakukan HTTP request. Contoh kode tersedia untuk cURL, PHP, Laravel, Node.js, Python, dan Go.
Setiap tagihan diberi kode unik kecil sehingga totalnya berbeda, misalnya Rp50.123 dan Rp50.481, dan pembayaran bisa dicocokkan tepat.
Komunikasi memakai HTTPS, API key bisa dirotasi, dan setiap webhook ditandatangani HMAC SHA-256 agar server Anda bisa memastikan keasliannya.
Daftar gratis, upload QRIS, dan buat tagihan pertama lewat API QRIS dalam hitungan menit.