For the complete documentation index, see llms.txt. This page is also available as Markdown.

QR Status Polling


v3 GET api.console.bayar.cash/v3/transactions/{transaction_id}/duitnow-qr/status


Lightweight polling endpoint for a DuitNow QR transaction created via the Generate DuitNow QR endpoint (or generate_qr: true). Use it to update your payment page while the payer scans.

Tip: Webhooks to your payment intent callback_url remain the primary payment notification — treat this endpoint as a UI fallback only. Fulfil orders from the callback, not from polling.

Example of sending GET request with cURL.

curl -X GET https://api.console.bayar.cash/v3/transactions/trx_z88ymJ/duitnow-qr/status \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <Personal_Access_Token>'

Example of JSON structured response.

{
    "transaction_id": "trx_z88ymJ",
    "status": 0,
    "status_description": "New",
    "is_terminal": false,
    "qr_expired": false,
    "qr_expires_at": "2026-08-20T14:05:12+08:00",
    "next_poll_after_ms": 2000
}
Field
Description

status

Transaction status code: 0 New, 1 Pending, 2 Unsuccessful, 3 Successful, 4 Cancelled, 5 Abandoned

is_terminal

true once the status is final — stop polling and show the result

qr_expired

true once qr_expires_at has passed — stop polling; the underlying transaction may stay non-terminal until housekeeping ages it out. Treat an expired QR as failed and generate a new one if the payer still wants to pay

next_poll_after_ms

Minimum delay before your next poll. null when the status is terminal or the QR has expired — stop polling


Polling Rules

  • Respect next_poll_after_ms between polls (default 2000 ms).

  • Stop polling when is_terminal is true or qr_expired is true (next_poll_after_ms will be null).

  • Requests are rate limited to 30 per minute per transaction, plus an overall per-merchant ceiling. A 429 response includes a Retry-After header — wait that many seconds before polling again.

Last updated