For the complete documentation index, see llms.txt. This page is also available as Markdown.

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 adminMintStatus transitions to MINTED. If your endpoint is unreachable, the callback is not retried automatically — respond with 2xx quickly and process asynchronously on your side.

  • No signature on the outgoing webhook. Reconcile by merchantOrderId against 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 standard Content-Type.

  • Two mint flavours:

    • IDRX mint — when requestType is empty or "idrx". Fires after IDRX is minted on-chain.

    • USDT onramp — when requestType is "usdt". Fires after the IDRX→USDT swap and USDT transfer to the destination wallet succeed.


Mint callback

Payload structure

Every mint callback body has these top-level fields:

Field
Type
Description

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

The callback payload and all status fields are identical whether the order was created through Flow A or Flow B.


TransactionHistory sub-object


MintRequestTransactionFees array


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 === toBeMinted

    • MintRequestTransactionFees = []

  • Fee deducted from minted IDRX

    • toBeMinted is lower than paymentAmount

    • A 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

QRIS is temporarily undocumented. QRIS remains a supported payment method and is not being withdrawn — its documentation is hidden while we carry out maintenance, and will be restored afterwards. If you need QRIS details in the meantime, contact support@idrx.co.


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)

Empty MintRequestTransactionFees on VA payments is expected behaviour.


USDT onramp variant

When requestType === "usdt":

  • Callback fires after the IDRX → USDT swap completes

  • Payload shape is identical

  • usdtRequest becomes 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.

adminMintStatus is an internal operational field. It appears in the payload for reference, but its values can change as our operational process changes — don't build integration logic around it.


Redeem callback

IDRX


USDT / USDC / USDT0


See also

Last updated