Transaction status
GET /check-status/{merchant_transaction_id}
Requires a Bearer token. Replace {merchant_transaction_id} with the identifier you provided when initiating the transaction. Works for payins and payouts alike.
- cURL
- Node.js
- PHP
- Python
curl https://services.moya-pay.com/service/api/v1/check-status/ORDER-2026-000123 \
-H "Authorization: Bearer $TOKEN"
const res = await fetch(
'https://services.moya-pay.com/service/api/v1/check-status/ORDER-2026-000123',
{ headers: { Authorization: `Bearer ${token}` } },
);
const body = await res.json();
console.log(body.status);
<?php
$ch = curl_init('https://services.moya-pay.com/service/api/v1/check-status/ORDER-2026-000123');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $body['status'];
import requests
resp = requests.get(
"https://services.moya-pay.com/service/api/v1/check-status/ORDER-2026-000123",
headers={"Authorization": f"Bearer {token}"},
timeout=30,
)
print(resp.json()["status"])
Response
{
"status": "SUCCESS",
"success": true,
"code": 200,
"message": "your transaction is SUCCESS"
}
The transaction status is in the status field.
While the transaction is pending, the API queries the operator live to give you the most recent state. A PENDING status on the operator side is presented as INITIATED.
Transaction not found
If the identifier does not exist, the response has HTTP status 500:
{
"status": "error",
"description": "Impossible to get transaction",
"success": false,
"code": 500,
"message": "Internal server error occurred"
}
In this specific case, description tells you the transaction does not exist.
The statuses
| Status | Meaning | Final? |
|---|---|---|
INITIATED | The transaction is created at the operator, waiting for a customer action | No |
PENDING | Waiting for confirmation | No |
PROCESSING | Internal processing in progress | No |
PENDING1 | Internal wait: automatic verification could not complete. Treat it as "pending" | No |
SUCCESS | The money has moved | Yes |
FAILED | Failure, refusal, cancellation or expiry | Yes, see below |
FAILED is not always definitiveIn rare cases an operator confirms late a transaction already marked FAILED (for example after a timeout). It can then move to SUCCESS, and you receive a new callback. Always reconcile your orders with the latest known status.
Best practices
- Rely on callbacks first, and use this endpoint to catch up on a missed notification.
- Poll at a reasonable interval (a few seconds between two calls), not in a tight loop.
- If a transaction stays pending well beyond the operator's usual duration, do not consider it failed: keep querying it.