Developer Portal

Dokumentasi API & Webhook
Qris Pay

Dokumentasi REST API dan Webhook Qris Pay untuk integrasi cepat payment gateway QRIS otomatis.

Overview

Pengantar integrasi Qris Pay Payment API

Qris Pay menyediakan REST API untuk membuat transaksi QRIS dinamis, memantau status pembayaran, dan menerima notifikasi real-time ke server Anda melalui webhook.

REST API

Format JSON standar. Semua request gunakan header x-license-key.

HTTPS Only

Semua endpoint hanya bisa diakses lewat koneksi HTTPS.

Rate Limit

Batas 120 request per menit per License Key pada endpoint generate.

Production API: https://api.QrisPayapp.web.id

Semua request harus menyertakan header x-license-key: YOUR_LICENSE_KEY. License Key tersedia di halaman API Keys.

Panduan Setup

Ikuti tahapan berikut secara berurutan untuk menyiapkan akun, QRIS, kredensial API, dan aplikasi listener hingga siap menerima pembayaran.

  1. 1
    Buat akun di QrisPayapp.web.id — registrasi akun terlebih dahulu sebagai dasar seluruh layanan Qris Pay.
  2. 2
    Upload QRIS di halaman QRIS Saya — unggah QRIS statis Anda agar bisa diubah menjadi QRIS dinamis otomatis.
  3. 3
    Generate API Key (License Key & Webhook Secret) — generate KEDUANYA di halaman API Keys; listener app dan callback pembayaran membutuhkan keduanya.
  4. 4
    Download aplikasi Qris Pay di Play Store — cari "Qris Pay : Gateway Qris" di Google Play Store, lalu instal di HP Android Anda.
  5. 5
    Login akun di aplikasi Qris Pay — gunakan akun yang sama dengan yang Anda daftarkan di QrisPayapp.web.id.
  6. 6
    Masuk ke tab Setting di aplikasi Qris Pay — buka menu pengaturan di dalam aplikasi untuk konfigurasi listener.
  7. 7
    Nyalakan Listener App & lengkapi checklist hijau — pastikan semua item checklist berwarna HIJAU: izinkan akses notifikasi, dan isi sumber QRIS sesuai merchant yang Anda pakai. Jika merchant tidak ada di Aksi Cepat, silakan hubungi admin WhatsApp.
  8. 8
    Buat code untuk integrasi API — gunakan endpoint Generate QRIS v1/v2 di bawah ini pada backend Anda, lengkap dengan contoh request dan response.

Catatan: Pada langkah 7, pastikan semua item checklist berwarna hijau sebelum mulai membuat transaksi uji. Jika merchant yang Anda pakai tidak ada di daftar Aksi Cepat aplikasi, silakan hubungi admin melalui WhatsApp.

Video Tutorial Setup: Segera Hadir

Generate QRIS V1

Membuat transaksi QRIS dinamis

Endpoint utama untuk membuat transaksi QRIS dinamis. Sistem otomatis menyisipkan kode unik acak ke nominal untuk membedakan setiap transaksi.

POST/api/generate/qris

Jika pengaturan Wajibkan Aplikasi Aktif di halaman Pengaturan Anda aktif, endpoint ini akan menolak request dengan 403 ketika tidak ada perangkat listener yang online.

Parameter

ParameterTypeSifatDeskripsi
idStringWajibID QRIS Merchant (UUID) yang terdaftar.
amountNumberWajibNominal dasar transaksi sebelum kode unik.
useUniqueCodeBooleanOpsionalSematkan kode acak 1–999 di belakang nominal.
packageIdsArray[String]WajibPackage ID aplikasi (cth: ["id.dana"]).
expiredInMinutesNumberOpsionalKedaluwarsa dalam menit (default: 15).
prefixStringOpsionalPrefix ID Transaksi, maks 8 karakter.
POST /api/generate/qris HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json

{
  "id": "986b2a0a-5c95-4177-9800-02d84a35338e",
  "amount": 10000,
  "useUniqueCode": true,
  "packageIds": ["id.dana"],
  "expiredInMinutes": 15,
  "prefix": "CSK"
}
Generate QRIS V2

Versi API terbaru dengan parameter fleksibel

Mendukung parameter tambahan seperti qrType, paymentMethod, dan useQris untuk lebih banyak skenario pembayaran.

POST/api/generate/v2/qris

Parameter

ParameterTypeSifatDeskripsi
qr_idStringWajibID QRIS Merchant (UUID).
amountNumberWajibNominal pembayaran dasar.
useUniqueCodeBooleanOpsionalAktifkan kode unik acak.
packageIdsArray[String]WajibPackage ID aplikasi yang diizinkan.
expiredInMinutesNumberOpsionalMenit batas kedaluwarsa.
qrTypeStringWajib"dynamic" atau "static".
paymentMethodStringWajib"qris" (scan) atau "ewallet".
useQrisBooleanWajibSertakan qr_string di respons.
prefixStringOpsionalPrefix ID Transaksi, maks 8 karakter.
POST /api/generate/v2/qris HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json

{
  "qr_id": "986b2a0a-5c95-4177-9800-02d84a35338e",
  "amount": 15000,
  "useUniqueCode": true,
  "packageIds": ["id.dana", "com.shopee.id"],
  "expiredInMinutes": 15,
  "qrType": "dynamic",
  "paymentMethod": "qris",
  "useQris": true,
  "prefix": "CSK"
}
Cek Status Transaksi

Polling status pembayaran secara real-time

POST/api/generate/check-status

Parameter

ParameterTypeSifatDeskripsi
transactionIdStringWajibID Transaksi unik dari hasil Generate API.

Status: pending paid cancel expired

POST /api/generate/check-status HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json

{
  "transactionId": "CSK-c39e25d2-0cb2-4a00-9941-863863486df8"
}
Cek Device Listener

Status perangkat aplikasi listener Android Anda

Gunakan endpoint ini untuk memeriksa apakah perangkat listener (aplikasi Qris Pay di HP Android) sedang online sebelum membuat transaksi.

GET/api/device/check
GET /api/device/check HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Mark Paid (Manual)

Tandai transaksi pending/expired sebagai lunas secara manual

Gunakan endpoint ini untuk menyelesaikan transaksi secara manual ketika pembayaran sudah diterima namun belum terdeteksi otomatis. Hanya transaksi berstatus pending atau expired yang dapat ditandai lunas.

POST/api/generate/mark-paid

Parameter

ParameterTypeSifatDeskripsi
transactionIdStringWajibID Transaksi yang ingin ditandai lunas.
packageNameStringOpsionalNama paket (default: "manual.approval").
appNameStringOpsionalNama aplikasi (default: "Manual Dashboard").
titleStringOpsionalJudul notifikasi (default: "Persetujuan Manual").
textStringOpsionalPesan tambahan (default: "Disetujui secara manual melalui Dashboard").
packageIdsArray[String]OpsionalPackage ID aplikasi (default: ["manual"]).
POST /api/generate/mark-paid HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json

{
  "transactionId": "CSK-c39e25d2-0cb2-4a00-9941-863863486df8",
  "packageName": "manual.approval",
  "appName": "Manual Dashboard",
  "title": "Persetujuan Manual",
  "text": "Disetujui secara manual melalui Dashboard",
  "packageIds": ["manual"]
}
Endpoint Lainnya

Cancel, list, hapus riwayat, dan profile.

POST/api/generate/cancel-status

Cancel Transaksi

Batalkan transaksi secara paksa sebelum expired.

GET/api/generate/list

List Transaksi

Daftar semua transaksi dengan filter status, halaman, dan pencarian. Parameter: status (pending | paid | cancel | expired), page, limit, search, sort.

POST/api/generate/list-delete

Hapus Riwayat Transaksi

Hapus log riwayat — satu, massal, atau semua sekaligus. Parameter: transactionId, transactionIds, clearAll.

GET/api/profile

Profile

Mendapatkan data profil lisensi aktif (aman, mengecualikan kunci lisensi atau secret key).

SDK Node.js & TypeScript

Library integrasi dari komunitas

Library NPM qrispay ini dibuat dan dipelihara secara independen oleh salah satu pelanggan/developer aktif Qris Pay.

Instalasi

npm install qrispay

Inisialisasi & Penggunaan

import { QrisPay } from "qrispay";

const qrispay = new QrisPay({ licenseKey: "YOUR_LICENSE_KEY" });

const trx = await qrispay.generateQRISv2({
  qr_id: "986b2a0a-5c95-4177-9800-02d84a35338e",
  amount: 10000,
  packageIds: ["id.dana"],
  qrType: "dynamic",
  paymentMethod: "qris",
  useQris: true,
  useUniqueCode: true,
});
Webhook Callback

Notifikasi otomatis saat transaksi lunas

Qris Pay mengirim HTTP POST ke URL webhook Anda secara otomatis saat transaksi berubah menjadi paid.

Notifikasi Instan

Dikirim dalam hitungan detik setelah transaksi terverifikasi lunas.

HMAC-SHA256

Setiap payload ditandatangani untuk menjamin keaslian data.

Auto Retry 3x

Retry otomatis hingga 3 kali jika server tidak merespons 10 detik.

Struktur Payload

FieldTypeDeskripsi
transactionIdStringID unik transaksi.
amountNumberNominal total transaksi.
packageNameStringPackage ID aplikasi pengirim.
appNameStringNama tampilan aplikasi pengirim.
statusString"paid" — status transaksi terverifikasi lunas.
paidAtStringTimestamp ISO 8601 saat pembayaran selesai.
{
  "transactionId": "TX987654321",
  "amount": 55000,
  "packageName": "com.company.paymentapp",
  "appName": "Payment App Name",
  "status": "paid",
  "paidAt": "2026-06-04T03:38:35Z"
}

Signature Verification — Verifikasi keaslian webhook dengan HMAC-SHA256

Setiap webhook request ditandatangani menggunakan Webhook Secret Anda. Tanda tangan dikirimkan melalui header X-QrisPay-Signature.

  1. Ambil header X-QrisPay-Signature dari request masuk.
  2. Gunakan raw body sebelum di-parse (parsing JSON mengubah urutan key sehingga signature tidak cocok).
  3. Hitung HMAC-SHA256 menggunakan raw body sebagai message dan Webhook Secret sebagai key.
  4. Bandingkan constant-time menggunakan timingSafeEqual / hash_equals.

Penting: Gunakan raw body (sebelum di-parse) sebagai input HMAC.

Retry Policy

Sistem retry pengiriman webhook jika server Anda tidak merespons dengan HTTP 2xx dalam waktu 10 detik.

  • Percobaan 1 — Segera setelah transaksi lunas terdeteksi
  • Retry ke-1 — 30 detik setelah gagal pertama
  • Retry ke-2 — 2 menit setelah retry pertama gagal
  • Berhenti — Tidak ada retry selanjutnya

Setelah 3 kali gagal, webhook tidak dikirim ulang. Balas dengan 200 segera, lalu proses payload secara asynchronous di background.

QR Code Generator

Render string data menjadi QR Code visual

Tool untuk mengonversi data string menjadi gambar QR Code. Berguna untuk debugging QRIS string yang di-generate API.

Opsi Desain

Classic, Block, Rounded

Resolusi

200×200, 300×300, 500×500

API URL

https://larabert-qrgen.hf.space/v1/create-qr-code?size=300x300&style=2&color=111111&data=https%3A%2F%2Fqrispayapp.web.id