Skip to content
StraventaDocs
Payment Methods

QRIS Dynamic

Real-time QR — one QR per transaction, T+0 settlement

QRIS Dynamic generates a unique QR code per transaction. The payer scans it with any QRIS-compatible mobile-banking or e-wallet app. Real-time settlement via RTGS (T+0).

FieldValue
allowed_channels valueqris
TTL30 min
Refund supportManual only — issue a bank transfer
SettlementT+0 (real-time RTGS)
Channel-typed response fieldsqr_string (raw QRIS payload), checkout_url

Create intent

See the canonical create-intent example — pass allowed_channels: ["qris"].

curl -X POST https://sandbox.505pay.link/v1/payments/intents \
  -H "Authorization: Bearer $PAYOPS_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $YOUR_KEY" \
  -d '{
    "merchant_id": "'"$PAYOPS_MERCHANT_ID"'",
    "amount_idr": 50000,
    "max_uses": 1,
    "allowed_channels": ["qris"]
  }'

The response includes qr_string and checkout_url. Render qr_string as a QR image with any client-side library (e.g. qrcode.js), or redirect to checkout_url to let 505pay host the QR UI.

Sandbox simulator

curl -X POST "https://sandbox.505pay.link/v1/payments/intents/$INTENT_ID/sandbox-complete" \
  -H "Authorization: Bearer $PAYOPS_SECRET_KEY"

Triggers payment.completed webhook + flips intent status to paid.

Webhook events

  • payment_intent.created — fired on POST intent.
  • payment.completed — fired when the payer's bank settles.
  • payment_intent.expired — fired if no completion within the TTL.

See Payment lifecycle.

Was this page helpful?

On this page