Skip to main content

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 https://services.moya-pay.com/service/api/v1/check-status/ORDER-2026-000123 \
-H "Authorization: Bearer $TOKEN"

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​

StatusMeaningFinal?
INITIATEDThe transaction is created at the operator, waiting for a customer actionNo
PENDINGWaiting for confirmationNo
PROCESSINGInternal processing in progressNo
PENDING1Internal wait: automatic verification could not complete. Treat it as "pending"No
SUCCESSThe money has movedYes
FAILEDFailure, refusal, cancellation or expiryYes, see below
FAILED is not always definitive

In 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.