Flow Overview 💳

Step-by-Step Workflow

Step 1: Upload QRIS

On first setup, upload your QRIS image to the platform. This only needs to be done once.

Request:

POST /api/v1/qrisly/upload-qris
- File: QRIS image (PNG/JPG)
- Name: Identity of your QRIS

Response:

{
  "qris_id": "9d6c9f9e-8c33-4f42-8b1f-0e6a3e2e7d10",
  "name": "abc",
  "merchant_name": "YZ Digital"
}

Step 2: Generate QRIS

Every time there's a new order, generate a QRIS with the appropriate amount.

Request:

POST /api/v1/qrisly/generate-qris
- qris_id: from step 1
- amount: Amount to be paid in Rupiah
- output_type: "string" or "image"

Response:

{
  "history_id": 1758,
  "qris_string": "00020101...",
  "original_amount": 1000,
  "final_amount": 1001,
  "payment_status": "unpaid",
  "expiry_time": "2026-03-03 11:03:27"
}

💡 Tip: Save this history_id for tracking payment status later.


Step 3: Setup Webhook & Wait for Payment

After generating the QRIS, the customer can scan and pay. You will receive webhook notifications automatically.

Webhook Event:

{
  "qris_history_id": 1771,
  "transaction_id": "TEST-177251866516",
  "payment_status": "paid",
  "amount": 1001,
  "paid_amount": 1001,
  "paid_at": "2026-03-03 13:17:47",
  "expired_at": "2026-03-03 13:22:22"
}

Step 4: Verify Payment Status

Verify the payment using the status endpoint to ensure confirmation.

Request:

GET /api/v1/qrisly/payment-status/{history_id}

Response:

{
  "history_id": 1770,
  "payment_status": "paid",
  "amount": 1001,
  "name": "ABC",
  "paid_at": null,
  "created_at": "2026-03-03T13:14:13+07:00",
  "updated_at": "2026-03-03T13:16:22+07:00"
}