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

POST /api/transaction/mint-request

Use this API to request a IDRX minting transaction in one of our supported chains.

Check out this page to see the list of chains where IDRX is available and this page to see the list of supported other stablecoins.

  • The balance will be processed and credited to `destinationWalletAddress` max 24 hours after your request is submitted.

  • Minimum transaction:

    • Minting IDRX is Rp20,000 IDR

    • Minting other stablecoins are $2 USD

  • Maximum transaction:

    • Minting IDRX is 1,000,000,000 IDR.

    • Minting other stablecoins are 5,555 USD

  • For transactions more than the maximum limit, please send your request to support@idrx.co to be processed.

  • The transaction will be automatically canceled if you have not made a payment within 24 hours.

  • IDRX is not responsible for deposit errors from incorrect Virtual Account numbers. Refunds for payments made to Virtual Account numbers under a different name will be processed within 14 business days.

POST https://idrx.co/api/transaction/mint-request

Quick start

curl -X POST 'https://idrx.co/api/transaction/mint-request' \
  -H 'idrx-api-key: <API_KEY>' \
  -H 'idrx-api-sig: <SIGNATURE>' \
  -H 'idrx-api-ts: <TIMESTAMP>' \
  -H 'Content-Type: application/json' \
  -H 'User-Agent: my-app/1.0' \
  -d '{
    "toBeMinted": "20000",
    "destinationWalletAddress": "0x7D1398C397C64368B7079bD5b3EE904aaaf8A495",
    "networkChainId": "8453",
    "returnUrl": "https://your-app.example.com/callback",
    "requestType": "idrx"
  }'

Redirect the user to data.paymentUrl from the response. After payment, IDRX is delivered to the wallet — usually within minutes.

For end-to-end integration including status tracking and reconciliation, see Processing Mint IDRX Requests.


Pick a flow

Flow A — Hosted checkout

Flow B — Direct payment

Use when

Web, dashboards, top-up flows

Mobile apps, kiosks, white-label UX

You build

Nothing — we host the payment page

Your own VA / QR screen

Payment methods

All (VA, QRIS, e-wallets, retail)

One per request: VA or QRIS

You receive

paymentUrl

virtualAccountNo or qrContent

returnUrl

Required

Not used

paymentMethod + channelId

Omit

Required

Both flows share auth, parameters, and callbacks.


Authentication

Every request needs four headers:

Header
Value

idrx-api-key

Your API key

idrx-api-sig

HMAC-SHA256 signature (see formula below)

idrx-api-ts

Unix timestamp in milliseconds

User-Agent

Custom string like my-app/1.0 (why)

Signature formula

For GET requests with no body, use SHA256("").

Full guide: Generating a Signature

API keys are issued via:


Parameters

Parameter
Type
Required
Description

toBeMinted

string

Amount to mint. Min 20,000 IDR or 2 USD. Max 1,000,000,000 IDR or 5,555 USD.

destinationWalletAddress

string

Recipient wallet on the target chain.

networkChainId

string

Target chain ID. Supported chains →

returnUrl

string

Flow A

HTTPS URL the user returns to after checkout.

requestType

string

"idrx" (default) or "usdt". Other tokens →

paymentMethod

string

Flow B

"va" or "qris". Requires channelId.

channelId

string

If paymentMethod

"MANDIRI", "BRI" for VA. "SQ" for QRIS.

expiryPeriod

number

Payment window in minutes. Default 120.

productDetails

string

Custom note on payment page. Max 255 chars.

customerDetail

object

{ firstName, lastName, email }. Each max 50 chars.


Flow A — Hosted checkout

Request

Response

  1. Redirect the user to paymentUrl.

  2. User picks a payment method and pays.

  3. User is redirected to your returnUrl.

  4. You receive a callback on settlement.

Fee handling depends on the payment method the user picks. For VA and e-wallet, the fee is added on top of toBeMinted (the user pays slightly more). For QRIS, the fee is deducted from the minted IDRX. See Fee structure by payment method for the full matrix.


Flow B — Direct payment

Virtual Account

Request

Response

Display virtualAccountNo with a copy button. User pays the exact amount from their bank app.


QRIS

Request

Response

Render qrContent as a QR image. Don't decode it — pass it as-is.

Or redirect to redirectUrl for a hosted QR page.

qrContent is an EMVCo TLV payload (Indonesian QRIS standard), not a URL. Starts with 000201.... Works with GoPay, OVO, Dana, ShopeePay, mobile banking.


Recover lost payload

If the user closes your app before paying, fetch the cached payload instead of creating a new order:

Returns the same VA / QRIS payload plus current paymentStatus.

Only the partner that created the order can fetch it.


Confirming payment

A transaction has two status fields you must track together:

Field
Tracks

paymentStatus

The fiat payment (VA / QRIS / checkout)

userMintStatus

The on-chain token delivery

Success state

Terminal states

  • MINTED

  • REFUND

  • REJECTED

  • paymentStatus: EXPIRED

Confirm via callback, or poll Transaction History by merchantOrderId and stop on a terminal state.

Full state machine, reconciliation pattern, and edge cases: Processing Mint IDRX Requests


Errors

Status
Cause
Fix

400

Invalid parameter

Check param types and limits

401

Bad signature or timestamp drift

Recompute signature; sync server clock (NTP)

403

Blocked User-Agent

Set custom User-Agent like my-app/1.0

422

Unsupported channelId for merchant

Contact support@idrx.co to enable

429

Rate limit

Back off and retry

5xx

Server error

Retry with backoff. Don't create a new order — recover the payload instead


See also


The returned amount value will be different from the request in toBeMinted parameter. This is the amount after fees and will be the amount that the user are going to pay.

Use the payment page in paymentUrl to pay the amount required. Shortly after the payment is done, IDRX tokens will be minted and sent to the specified destination wallet address. In the case of "usdt" requestType, USDT tokens will be sent to the wallet address.

To check the status of the transaction, you can use the Transaction History API.

Last updated