QRIS statis kamu
Upload gambar QRIS atau tempel payload-nya langsung.
Gambar diproses di browser. Nggak diupload ke mana-mana.
qris1_...
Upload stiker QRIS kamu, tentukan nominal, langsung dapat QR siap bayar. Simpan kode merchant buat dipakai ulang — atau sambungkan ke bot lewat API.
Buat siapa aja — tanpa login, tanpa API key, tanpa biaya. Dibuat oleh CasperSec.
Upload gambar QRIS atau tempel payload-nya langsung.
Gambar diproses di browser. Nggak diupload ke mana-mana.
qris1_...
Nominal dikunci di dalam QR — pembeli nggak bisa ubah.
Contoh: 25.000 untuk paket premium.
Diproses via serverless function — payload nggak disimpan.
QRIS Studio mengubah stiker QRIS statis milikmu menjadi QRIS dinamis dengan nominal yang sudah dikunci. Upload gambar QRIS atau tempel payload-nya, isi nominal, lalu download QR siap scan. Semua diproses di browser dan gratis 100%.
QRIS dinamis adalah QRIS yang sudah membawa nominal pembayaran di dalam payload. Pembeli cukup scan dan bayar, tanpa bisa mengubah jumlahnya. Cocok untuk toko online, invoice, bot Telegram, atau kasir.
Endpoint publik yang sama bisa dipanggil dari Next.js, Node.js, Python, PHP, Go, atau bot apa pun. Tinggal kirim nominal dan payload QRIS, terima PNG base64.
Baca dokumentasi API →QRIS dinamis adalah QRIS yang nominal pembayarannya sudah dikunci di dalam kode QR. Pembeli tidak bisa mengubah nominal, jadi cocok untuk checkout toko online, bot, dan invoice.
Ya, 100% gratis. Nggak ada langganan, login, atau API key. Generator dan API bisa dipakai siapa aja.
Gambar QRIS diproses di browser dan nggak diunggah ke server. Payload merchant disimpan di localStorage browser kamu, bukan di database.
Bisa. API-nya terbuka untuk Next.js, Node.js, Python, PHP, Go, dan stack lain yang bisa HTTP. Lihat dokumentasi API.
Nggak perlu. Buka generator, upload QRIS, isi nominal, langsung generate.
Kode merchant disimpan di browser ini. Pakai ulang tanpa upload QRIS lagi.
Setelah QRIS berhasil dibaca, tekan ikon simpan di kartu merchant. Kodenya bakal muncul di sini.
Publik, gratis, tanpa API key. Bisa dipanggil dari Next.js, Node.js, Python, PHP, Go — apa pun yang bisa HTTP.
/api
Juga bisa GET /api?amount=25000&code=qris1_... untuk request simpel, atau tambah &raw=1 untuk langsung dapat file PNG. Nggak perlu daftar, token, atau header otentikasi.
Nggak perlu curl. Pilih nominal, klik tes, dan lihat response asli dari server. Payload demo ini valid CRC, tapi bukan merchant asli — aman buat ngetes.
—curl ...
...
{
"amount": "25000",
"qris_statis": "000201010211...6304ABCD"
}
Ganti qris_statis dengan "code": "qris1_..." dari tab Generator kalau nggak mau kirim payload panjang.
const res = await fetch("https://.../api", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ amount: "25000", qris_statis: payload })
});
const data = await res.json();
document.querySelector("img").src = data.qris_data_url;
{
"status": "success",
"message": "QRIS dinamis berhasil dibuat.",
"method": "dynamic",
"amount": 25000,
"qris_base64": "iVBORw0KGgo...",
"qris_data_url": "data:image/png;base64,iVBOR...",
"qris_string": "000201010212...6304ABCD",
"code": "qris1_...",
"crc": "ABCD",
"merchant": {
"name": "CasperService ID",
"city": "KOTA SEMARANG",
"nmid": "ID1024353677700",
"acquirer": "GoPay"
},
"generated_at": "2026-11-05T07:00:00.000Z"
}
qris_base64 = PNG tanpa prefix. qris_data_url = siap dipasang di <img src>. qris_string = payload dinamis final.
amountWajib. Nominal bulat > 0, maks 100.000.000.000. Titik/spasi otomatis dibuang.qris_statisPayload QRIS statis (atau yang sudah dinamis). Alias: qris, payload, template.codeKode simpan qris1_... dari tab Generator. Alternatif payload mentah.rawOpsional. true/1 = balikan PNG langsung, bukan JSON. Bisa lewat query GET.Body JSON atau form-urlencoded sama-sama diterima. GET juga bisa: /api?amount=25000&code=qris1_...
400BAD_AMOUNT — nominal kosong, 0, atau bukan angka.400NO_QRIS — payload dan kode sama-sama nggak dikirim.400BAD_CODE — kode qris1_... rusak atau bukan base64url valid.422QRIS_BAD_CRC / QRIS_NO_CRC — payload rusak, terpotong, atau CRC nggak cocok.422QRIS_NOT_QRIS / QRIS_TRUNCATED — bukan payload QRIS atau strukturnya nggak lengkap.Semua error balikin {"status":"error","code":"...","message":"..."} dengan HTTP status yang sesuai.
API ini cuma HTTP + JSON — nggak ada SDK khusus atau API key. Mau dari server Next.js, Node.js, Python, PHP/Laravel, Go, bot Telegram, cron, React Native, sampai Postman? Semua bisa.
const res = await fetch("https://.../api", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
amount: "25000",
qris_statis: process.env.QRIS_STATIS
})
});
const data = await res.json();
// data.qris_base64 → PNG base64
import requests
res = requests.post(
"https://.../api",
json={"amount": "25000", "qris_statis": QRIS_STATIS},
timeout=20,
)
data = res.json()
# data["qris_base64"] → PNG base64
$ch = curl_init("https://.../api");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"amount" => "25000",
"qris_statis" => $qrisStatis,
]),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
Contoh di atas pakai endpoint yang sama persis. Stack lain tinggal kirim POST JSON dengan field amount dan qris_statis.
Bot yang sudah kirim {"amount","qris_statis"} dan baca qris_base64 bisa langsung diarahkan ke endpoint ini. Ganti QRIS_API_URL, QRIS_TEMPLATE tetap.
QRIS_API_URL=https://domain-kamu.netlify.app/api
QRIS_TEMPLATE=00020101021126610014COM.GO-JEK...
Setelah custom domain aktif, ganti host-nya ke subdomain kamu. Gak ada perubahan kode. Endpoint yang sama juga bisa dipakai bot Telegram, WhatsApp, Discord, atau cron job apa pun.