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).
| Field | Value |
|---|---|
allowed_channels value | qris |
| TTL | 30 min |
| Refund support | Manual only — issue a bank transfer |
| Settlement | T+0 (real-time RTGS) |
| Channel-typed response fields | qr_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?