Skip to content
PGSwift Docs
Documentation/Check Transaction Status

Check Transaction Status

Use this API to check transaction status. When the rrn parameter is provided, it takes priority in the search.

POST /api/check/transaction

Request

NameTypeRequiredDescription
merchant_transaction_idstringfalseMerchant-provided transaction identifier.
rrnstringfalseRetrieval Reference Number from the payment transaction. When rrn is provided, it takes priority in the search.
{
  "merchant_transaction_id": "INQ12300456",
  "rrn": "015221245517"
}

Response

NameDescription
statusRequest status indicator. true indicates success, false indicates failure.
data.statusCurrent transaction status: Success, Pending, or Fail. Returned in TitleCase. See Status Values.
data.transaction_idSystem-generated unique transaction identifier.
data.merchant_transaction_idMerchant-provided transaction identifier.
data.amountTransaction amount as a string with 2 decimal places (e.g., "100000.00").
data.channelPayment channel used for the transaction. The format depends on the payment type. See Channel Values.
data.payment_channelNormalized payment channel, one format for every payment type and provider: a value such as QRIS, VA_BRI, BANK_BCA, or EWALLET_DANA (payment type prefix + code from the Appendix). null when the channel cannot be determined. Prefer this over channel.
data.created_atTransaction creation timestamp.
data.updated_atLast update timestamp for the transaction.
data.service_fee_ratePercentage fee rate applied to amount, e.g. "4.00" means 4%. See Fee Calculation.
data.service_fee_amountFixed fee charged per transaction. This is not the total fee; see service_fee_final.
data.service_fee_finalTotal fee deducted from the transaction: the percentage fee plus service_fee_amount.
data.nett_amountAmount credited to the merchant: amount minus service_fee_final.
data.rrnRetrieval Reference Number from the payment transaction.
data.expired_atPayment expiry datetime. Format depends on channel: QRIS uses ISO 8601 UTC; other channels use server time (UTC+7), no offset, YYYY-MM-DD HH:MM:SS. null if no payment or not applicable.
{
    "status": true,
    "data": {
        "status": "Success",
        "transaction_id": "0aa59d5a-2a10-45be-a174-f7b954113d12",
        "payment_channel": "QRIS",
        "created_at": "2025-01-01T00:00:00.000000Z",
        "updated_at": "2025-01-01T12:00:00.000000Z",
        "merchant_transaction_id": "INQ12300456",
        "amount": "100000.00",
        "channel": "QRIS",
        "service_fee_rate": "4.00",
        "service_fee_amount": "0.00",
        "service_fee_final": "4000.00",
        "nett_amount": "96000.00",
        "rrn": "987654321",
        "expired_at": "2025-02-26T12:00:00.000000Z"
    }
}

Fee Calculation

All fees are borne by the merchant and deducted from amount.

service_fee_final = amount × service_fee_rate / 100 + service_fee_amount
nett_amount       = amount − service_fee_final

The percentage part is rounded half up to 2 decimal places, then service_fee_amount is added.

In the example above, 100000.00 × 4 / 100 + 0.00 = 4000.00, so nett_amount is 96000.00.

Status Values

This endpoint returns data.status in TitleCase: Success, Pending, or Fail. Payment webhooks (V1 and V2) send the same statuses in lowercase (success, fail).

Channel Values

The format of data.channel depends on the payment type:

Payment type Format Example
QRIS QRIS QRIS
Virtual Account Bank code without a prefix (see Virtual Account codes) BCA, BRI, MDR
Bank Account BANK_ followed by the bank code (see Bank Account codes) BANK_BCA
E-Wallet E-wallet code (see E-Wallet codes) DANA, OVO
© 2026 PGSwift. All rights reserved.