| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Check the withdrawal associated with a UPI ATM QR using the Pay2New order ID returned by Generate QR.
POST https://pay2new.in/apis/upiAtm/v1/qrStatus
Headers
| Header | Required | Description |
|---|---|---|
| secret | Yes | Your Pay2New-issued API secret. |
| outletId | Yes | Active, onboarded Pay2New customer/outlet ID. Use the outlet for the withdrawal. |
| Content-Type | Yes for JSON | application/json |
| Accept | Recommended | application/json |
The partner account, KYC, wallet and API access must be active, the backend source IP must be registered, and UPI ATM service must be enabled.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| order_id | string | Yes | The exact Pay2New order_id returned by Generate QR. Leading/trailing spaces are removed. An empty value is rejected. |
Send the Pay2New order reference, not your request_id, the QR content or a provider ipayId. The lookup finds UPI ATM transactions belonging to the authenticated partner. JSON is recommended; the endpoint also accepts form POST fields.
{"order_id":"ORDER_ID_FROM_GENERATE_QR"}
cURL request
curl --request POST \
--url 'https://pay2new.in/apis/upiAtm/v1/qrStatus' \
--header 'secret: YOUR_PAY2NEW_SECRET' \
--header 'outletId: YOUR_PAY2NEW_OUTLET_ID' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{
"order_id": "ORDER_ID_FROM_GENERATE_QR"
}'
How status checking works
| Current transaction state | API behaviour |
|---|---|
| Pending | Attempts a status refresh, then returns the latest stored transaction result. If refresh is unavailable or still unresolved, the order may remain pending. |
| Already successful or failed | Returns the stored final transaction result. |
| Order cannot be found for this partner and service | Returns status 2 and Transaction not found, without a transaction response object. |
QR generation is not withdrawal success
Generate QR can succeed while the withdrawal remains pending. Confirm status 1 for the matching order_id before cash disbursement. HTTP 200, customer scanning, or a QR image disappearing does not establish successful withdrawal.
Interpret the result
| JSON result | Meaning | Client action |
|---|---|---|
| status 1 with the matching order_id | Confirmed successful withdrawal | Record completion once and use your cash-disbursement controls. |
| status 2 with the matching order_id and transaction details | Failed withdrawal | Show the failure. Do not disburse cash for this order. |
| status 3 with the matching order_id | Pending or unresolved withdrawal | Keep the existing order and check again with controlled polling/backoff. |
| status 2 with only message, without transaction details | Request, authentication, access or lookup error | Resolve the reported error. Do not mark an existing withdrawal failed just because its lookup failed. |
| Unexpected status or conflicting identifiers | Unresolved result | Retain the references and reconcile with Pay2New. |
QR state mapping
| qrStatus | Pay2New transaction outcome |
|---|---|
| SUCCESS | Final success: status 1. |
| FAILED | Final failure: status 2. |
| EXPIRED | Final failure: status 2. |
| REFUND | Final failure: status 2. This value alone is not a separate refund receipt. |
| INITIATED or another non-final state | Usually remains pending: status 3. Read the returned transaction status. |
A provider INITIATED result accompanied by SERVICE PROVIDER ERROR is normalized to FAILED when processed. Treat the returned numeric transaction status as the result for your order; qrStatus adds context.
Response fields
Successful lookups return these fields at the top level, not inside data.
| Field | Type | Description |
|---|---|---|
| status | integer | Stored withdrawal result: 1 success, 2 failure, 3 pending. Early request errors also use 2. |
| message | string | Stored transaction result message or an error description. |
| order_id | string | Pay2New UPI ATM order reference. Match it to the requested order. |
| request_id | string | Original client request reference supplied to Generate QR. |
| txn_value | string | Withdrawal amount formatted to two decimal places; grouping commas may appear. |
| balance | string | Wallet balance recorded with the transaction, formatted to two decimal places. It is not a fresh wallet-balance enquiry. |
| api_txn_id | string | Stored provider transaction reference; empty string when unavailable. |
| operator_reference | string | Stored operator/bank reference; empty string when unavailable. |
| qrStatus | string | Stored QR state; empty string when unavailable. |
| vpa | string | Stored payer VPA; empty string when unavailable. |
| mobile | string | Stored payer mobile; empty string when unavailable. |
| accountNumber | string | Stored payer account identifier as provided; empty string when unavailable. |
| customer_name | string | Stored payer name; empty string when unavailable. |
Provider references and payer details may not be available while pending. This API does not return qrString or expiryDt; retain those from Generate QR.
Response examples
Illustrative values only. Pending messages, references, payer details and balances vary.
Pending withdrawal
{
"status": 3,
"message": "Transaction Pending",
"order_id": "P2N_SAMPLE_UPIATM_ORDER",
"request_id": "UPIATM202609260001",
"txn_value": "100.00",
"balance": "1,000.00",
"api_txn_id": "SAMPLE_PROVIDER_ID",
"operator_reference": "",
"qrStatus": "INITIATED",
"vpa": "",
"mobile": "",
"accountNumber": "",
"customer_name": ""
}
Confirmed successful withdrawal
{
"status": 1,
"message": "Transaction Successful!",
"order_id": "P2N_SAMPLE_UPIATM_ORDER",
"request_id": "UPIATM202609260001",
"txn_value": "100.00",
"balance": "1,000.00",
"api_txn_id": "SAMPLE_PROVIDER_ID",
"operator_reference": "SAMPLE_OPERATOR_REFERENCE",
"qrStatus": "SUCCESS",
"vpa": "sample-customer@upi",
"mobile": "9000000001",
"accountNumber": "XXXX0001",
"customer_name": "Sample Customer"
}
Expired QR; failed withdrawal
{
"status": 2,
"message": "Transaction Failed!",
"order_id": "P2N_SAMPLE_UPIATM_ORDER",
"request_id": "UPIATM202609260001",
"txn_value": "100.00",
"balance": "1,000.00",
"api_txn_id": "SAMPLE_PROVIDER_ID",
"operator_reference": "",
"qrStatus": "EXPIRED",
"vpa": "",
"mobile": "",
"accountNumber": "",
"customer_name": ""
}
Failed withdrawal
{
"status": 2,
"message": "Transaction Failed!",
"order_id": "P2N_SAMPLE_UPIATM_ORDER",
"request_id": "UPIATM202609260001",
"txn_value": "100.00",
"balance": "1,000.00",
"api_txn_id": "SAMPLE_PROVIDER_ID",
"operator_reference": "",
"qrStatus": "FAILED",
"vpa": "",
"mobile": "",
"accountNumber": "",
"customer_name": ""
}
Order not found
{
"status": 2,
"message": "Transaction not found"
}
Missing order ID
{
"status": 2,
"message": "order_id is required"
}
Error handling and polling
| Situation | Handling |
|---|---|
| order_id is required | Send a non-empty Pay2New order reference. |
| Transaction not found | Check the reference, partner account and that the order came from UPI ATM Generate QR. |
| Outlet ID not found! / Invalid OutletId | Correct the outlet header or its onboarding state. |
| Authentication or service failure | Correct the account configuration described by message. |
| Network timeout or status 3 | Recheck the same order. Do not create a replacement withdrawal merely because the outcome is not yet known. |
Stop normal polling after a confirmed final result. No fixed public polling interval is specified by this endpoint. Use controlled intervals/backoff and retain unresolved orders for reconciliation. Status refresh can finalize the existing transaction and its wallet settlement; it does not create a new withdrawal.
See the UPI ATM Integration Guide for the complete KYC → QR → status flow.
