Callback
Get notified when there is an update for transactions
Callback allows you to receive a notification when a minting or redemption transaction is completed. To use Callback, you must first generate an API Key. Once you have your API Key, navigate to the API Key menu and select the Callback URL tab to set it up.

Enter your Mint and Redeem Callback URLs. You may use a single endpoint for both callbacks if preferred. Once done, click the Save Callback URL button to confirm.

You’ll see a notification in the bottom-right corner once the Callback URL is successfully saved.

You can then use the endpoint to receive callbacks in your logs whenever there’s an update to your mint or redeem transactions. Please refer to the example below.
Delivery rules
These rules apply to both mint and redeem callbacks:
One callback per terminal state. The mint callback fires once when
adminMintStatustransitions toMINTED. If your endpoint is unreachable, the callback is not retried automatically — respond with2xxquickly and process asynchronously on your side.No signature on the outgoing webhook. Reconcile by
merchantOrderIdagainst your own state. Treat the request as untrusted until you've matched it and re-verified via Transaction History API.Body is
application/json. Headers are minimal — only the standardContent-Type.Two mint flavours:
IDRX mint — when
requestTypeis empty or"idrx". Fires after IDRX is minted on-chain.USDT onramp — when
requestTypeis"usdt". Fires after the IDRX→USDT swap and USDT transfer to the destination wallet succeed.
Since callbacks are not retried, missed deliveries must be reconciled by polling the Transaction History API using merchantOrderId.
Mint callback
Payload structure
Every mint callback body has these top-level fields:
id
number
Internal MintRequest ID
paymentAmount
number
Amount the user paid in IDR (before fees)
toBeMinted
string
IDRX amount minted (= paymentAmount minus deducted fees)
merchantOrderId
string
Your order ID
destinationWalletAddress
string
Wallet that received the IDRX or USDT
chainId
number
EVM chain ID
paymentStatus
enum
WAITING_FOR_PAYMENT / PAID / EXPIRED
userMintStatus
enum
PROCESSING / MINTED / NOT_AVAILABLE
adminMintStatus
enum
Internal operational state. Informational only — build your logic on userMintStatus
txHash
string
On-chain mint transaction hash
reference
string
Payment gateway reference
requestType
string
null / "idrx" / "usdt"
customerVaName
string
Source account name
paymentProviderId
number | null
Internal payment routing reference. Informational only
returnUrl
string | null
Echoed back from original request
expiryTimestamp
string
Unix epoch milliseconds
isApproved
boolean
Multisig approval flag
reportStatus
enum
NONE / REJECTED / PROCESSING / APPROVED
processByUserId
number | null
Admin processor
qredoTxId
string | null
Safe multisig transaction hash
signedTx
string | null
Solana signed transaction blob
deleted
boolean
Soft-delete flag
createdAt
ISO 8601
Creation timestamp
updatedAt
ISO 8601
Last updated timestamp
TransactionHistory
object
Payment gateway notification
MintRequestTransactionFees
array
Fee breakdown
usdtRequest
object | null
USDT swap details
TransactionHistory sub-object
MintRequestTransactionFees array
An empty array ([]) means the payment channel charges no IDRX-layer fee.
This is expected behaviour, not missing data.
usdtRequest sub-object (USDT onramp only)
Fee structure by payment method
Two patterns exist depending on the channel:
Fee added on top at checkout
paymentAmount === toBeMintedMintRequestTransactionFees = []
Fee deducted from minted IDRX
toBeMintedis lower thanpaymentAmountA fee row appears in
MintRequestTransactionFees
Channel
paymentCode
IDRX fee
Charged how
Effect
BNI VA
IQ
3,000 IDR
Added on top
Fees array empty
BRI VA
BR
3,000 IDR
Added on top
Fees array empty
OVO
OV
1.67%
Added on top
Fees array empty
DANA
DA
1.67%
Added on top
Fees array empty
Worked example — 100,000 IDR top-up
Channel
User pays
IDRX delivered
paymentAmount
toBeMinted
Fees
BRI VA (BR)
103,000
100,000
100000
"100000"
[]
OVO (OV)
101,670
100,000
100000
"100000"
[]
Universal reconciliation formula:
Mint examples
IDRX mint via BRI VA (BR)
USDT onramp variant
When requestType === "usdt":
Callback fires after the IDRX → USDT swap completes
Payload shape is identical
usdtRequestbecomes populated
Reconciliation tips
For high-value transactions, verify on-chain delivery using txHash.
Status handling
Build your logic on userMintStatus, together with paymentStatus.
userMintStatus
Meaning
Action
MINTED
Tokens delivered
Mark success
REFUND
Payment refunded
Mark cancelled
REJECTED
Request rejected
Mark cancelled
PROCESSING
Delivery in flight
Keep waiting
NOT_AVAILABLE
No minting activity yet
Keep waiting
Also treat paymentStatus: EXPIRED as terminal — the payment window closed before the customer paid.
Redeem callback
IDRX
USDT / USDC / USDT0
See also
POST /transaction/mint-request — how mint orders are created.
Processing Mint IDRX Requests — end-to-end mint flow with reconciliation pattern.
Transaction History API — pull state by
merchantOrderIdif a webhook is missed.
Last updated