> ## Documentation Index
> Fetch the complete documentation index at: https://docs.singapay.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> Generate dynamic QRIS codes for single fixed-amount transactions — Indonesia's standardized QR payment system accepted across all major e-wallets and banking apps.

QRIS (Quick Response Code Indonesian Standard) is Indonesia's unified QR payment standard that lets customers pay using any compatible app — GoPay, OVO, Dana, ShopeePay, and mobile banking. Unlike Virtual Account or Payment Link, **each QRIS code is generated for one specific transaction and expires after a single payment**.

<CardGroup cols={3}>
  <Card title="Instant generation" icon="bolt">
    Generate a QR code in one API call with a fixed amount — display it immediately to the customer.
  </Card>

  <Card title="All major apps" icon="mobile">
    Accepted by GoPay, OVO, Dana, ShopeePay, and all QRIS-compatible banking apps.
  </Card>

  <Card title="Real-time confirmation" icon="check">
    Payment status updates instantly via the QRIS network — no polling delay.
  </Card>
</CardGroup>

***

## Payment flow

```mermaid theme={null}
sequenceDiagram
  autonumber
  participant M as Merchant System
  participant S as SingaPay API
  participant C as Customer
  participant Q as QRIS Network

  M->>S: POST /qris-dynamic/{account_id}/generate-qr
  Note over M,S: Create QR with amount & expiry
  S-->>M: QRIS code string & QR image

  M->>C: Display QR code
  Note over M,C: App, website, or printed receipt

  C->>Q: Scan QR code
  Note over C,Q: Using GoPay, OVO, Dana, etc.
  C->>Q: Confirm payment (exact amount)

  Q->>S: Payment notification (real-time)
  S->>S: Update transaction status (open → paid)
  S-->>M: Webhook notification (optional)

  M->>S: GET /qris-dynamic/{account_id}/show/{id}
  Note over M,S: Verify final payment status
```

***

## Key difference: one QR = one transaction

<Warning>
  Unlike Virtual Account or Payment Link, **each QRIS code is valid for one payment only**. Once paid — or once expired — the code cannot be reused. Generate a new QR code for every new transaction.
</Warning>

<CardGroup cols={2}>
  <Card title="Cannot do" icon="ban">
    * Reuse the same QR code for multiple payments
    * Accept partial payments
    * Change the amount after generation
    * Keep a QR code active indefinitely
  </Card>

  <Card title="Must do" icon="circle-check">
    * Generate a new QR code for each transaction
    * Set the exact amount at creation time
    * Monitor payment status in real-time
    * Expire unused codes to prevent stale QRs
  </Card>
</CardGroup>

***

## Transaction status

| Status    | Description                                   |
| --------- | --------------------------------------------- |
| `open`    | QR code generated, awaiting customer payment. |
| `paid`    | Payment confirmed by the QRIS network.        |
| `expired` | QR code expired before payment was made.      |
| `settled` | Funds transferred to your account.            |

<Note>
  Only transactions with status `open` can be deleted. Paid or expired transactions cannot be removed.
</Note>

***

## Important notes

<AccordionGroup>
  <Accordion title="One-time use only" icon="qrcode">
    Each QRIS code is single-use. After a customer completes payment, the QR code is automatically invalidated and cannot accept another payment. Always generate a fresh QR for the next customer or transaction.
  </Accordion>

  <Accordion title="Fixed amount at generation" icon="scale-balanced">
    The payment amount is set at QR creation time and cannot be changed. The customer must pay the exact amount — QRIS does not support partial or over-payments.
  </Accordion>

  <Accordion title="Optional expiration" icon="hourglass">
    You can set an optional expiry time when generating a QR code. After expiry, the code cannot be scanned or paid. Unset expiry means the code stays `open` indefinitely until paid or manually deleted.
  </Accordion>

  <Accordion title="MDR fees" icon="percent">
    Merchant Discount Rate (MDR) applies to all QRIS transactions. The fee percentage depends on your merchant category (MCC) and your agreement with Singapay. MDR details are visible in each transaction record.
  </Accordion>

  <Accordion title="Settlement timeline" icon="calendar">
    QRIS settlements typically follow an **H+1 to H+2** schedule depending on the payment provider. Settlement timestamps are tracked in each transaction record.
  </Accordion>

  <Accordion title="Data retention" icon="database">
    Transaction records are retained for **1 year**. Data older than 1 year is archived and may not be accessible via the API.
  </Accordion>
</AccordionGroup>

***

## Available endpoints

<CardGroup cols={3}>
  <Card title="List QRIS Transactions" icon="list" href="./list">
    Paginated list of all QRIS transactions for an account with filter support.
  </Card>

  <Card title="Show QRIS Transaction" icon="eye" href="./show">
    Retrieve a single transaction by its numeric ID.
  </Card>

  <Card title="Generate Dynamic QRIS" icon="qrcode" href="./generate">
    Create a new MPM dynamic QR code for a fixed-amount transaction.
  </Card>
</CardGroup>

<Note>
  All endpoints require authentication. See [Authentication](/api-reference/authentication).
</Note>
