IDRX Transaction API
Mint, redeem, and bridge IDRX, and query rates/fees/history.
Mint, redeem, and bridge IDRX, and query rates/fees/history.
openapi: 3.1.0
info:
title: IDRX Onboarding Transaction API
version: '1.0'
description: IDRX is a stablecoin pegged 1:1 to the Indonesian Rupiah (IDR). This REST API lets business (organization) accounts onboard users, manage bank accounts, and process mint (fiat IDR -> IDRX / USDT on-chain), redeem (IDRX -> fiat IDR to a bank account), and bridge (move IDRX across supported EVM/Solana chains) transactions, plus query rates, fees, bank methods, and transaction history. All requests are authenticated with an API key plus an HMAC-SHA256 request signature. A custom `User-Agent` header is required (generic agents are blocked at the edge with HTTP 403 / Cloudflare 1010).
contact:
name: IDRX Support
email: support@idrx.co
url: https://docs.idrx.co
x-apievangelist-generated: '2026-07-19'
x-apievangelist-method: searched
x-apievangelist-source: https://docs.idrx.co/llms.txt
servers:
- url: https://idrx.co
description: Production
security:
- idrxApiKey: []
tags:
- name: Transaction
description: Mint, redeem, and bridge IDRX, and query rates/fees/history.
paths:
/api/transaction/mint-request:
post:
operationId: createMintRequest
tags:
- Transaction
summary: Create a mint request
description: Request an IDRX (or USDT) mint on a supported chain, paid with fiat IDR. Returns a hosted-checkout `paymentUrl` to redirect the user to. Min 20,000 IDR / 2 USD; max 1,000,000,000 IDR / 5,555 USD. Confirm settlement via the callback or Transaction History (do not trust the returnUrl redirect).
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- toBeMinted
- destinationWalletAddress
- networkChainId
- returnUrl
properties:
toBeMinted:
type: string
description: Amount to mint.
destinationWalletAddress:
type: string
networkChainId:
type: string
description: Target EVM/Solana chain ID.
returnUrl:
type: string
format: uri
requestType:
type: string
enum:
- idrx
- usdt
default: idrx
expiryPeriod:
type: integer
default: 120
description: Payment window in minutes.
productDetails:
type: string
maxLength: 255
customerDetail:
type: object
properties:
firstName:
type: string
maxLength: 50
lastName:
type: string
maxLength: 50
email:
type: string
format: email
responses:
'200':
description: Mint request created; redirect user to paymentUrl.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
type: object
properties:
id:
type: string
merchantOrderId:
type: string
merchantCode:
type: string
reference:
type: string
paymentUrl:
type: string
format: uri
amount:
type: string
description: Amount after fees the user pays.
statusCode:
type: string
statusMessage:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'422':
$ref: '#/components/responses/Unprocessable'
'429':
$ref: '#/components/responses/RateLimited'
/api/transaction/redeem-request:
post:
operationId: createRedeemRequest
tags:
- Transaction
summary: Create a redeem request
description: Redeem IDRX back to fiat IDR to a bank account, referencing the on-chain burn transaction hash. Funds credited within max 24 hours.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- txHash
- networkChainId
- amountTransfer
- bankAccount
- bankCode
- bankName
- bankAccountName
- walletAddress
properties:
txHash:
type: string
description: Hash of the token burn transaction.
networkChainId:
type: string
amountTransfer:
type: string
bankAccount:
type: string
bankCode:
type: string
bankName:
type: string
bankAccountName:
type: string
walletAddress:
type: string
notes:
type: string
responses:
'200':
description: Redeem request created.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
$ref: '#/components/schemas/RedeemRequest'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/api/transaction/bridge-request:
post:
operationId: createBridgeRequest
tags:
- Transaction
summary: Create a bridge request
description: Bridge IDRX from a source chain to a destination chain, referencing the burn tx hash and bridge nonce. Min 20,000 IDR.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- txHashBurn
- bridgeToChainId
- bridgeFromChainId
- amount
- bridgeNonce
- destinationWalletAddress
properties:
txHashBurn:
type: string
bridgeToChainId:
type: integer
bridgeFromChainId:
type: integer
amount:
type: string
bridgeNonce:
type: string
destinationWalletAddress:
type: string
responses:
'201':
description: Bridge request created.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
$ref: '#/components/schemas/BridgeRequest'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/api/transaction/method:
get:
operationId: getBankMethods
tags:
- Transaction
summary: Get bank methods
description: Get the list of supported bank names, bank codes, and max transfer amounts.
responses:
'200':
description: Bank method list.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
type: array
items:
type: object
properties:
bankCode:
type: string
bankName:
type: string
maxAmountTransfer:
type: string
'401':
$ref: '#/components/responses/Unauthorized'
/api/transaction/user-transaction-history:
get:
operationId: getTransactionHistory
tags:
- Transaction
summary: Get transaction history
description: List the account's mint/redeem/bridge transaction history. Poll by merchantOrderId to reconcile terminal states.
responses:
'200':
description: Transaction history.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
type: array
items:
type: object
'401':
$ref: '#/components/responses/Unauthorized'
/api/transaction/rates:
get:
operationId: getRates
tags:
- Transaction
summary: Get swap rates
description: Get current swap rates of IDRX to other tokens. Provide either idrxAmount or usdtAmount. chainId defaults to 137 (Polygon).
parameters:
- name: idrxAmount
in: query
schema:
type: string
description: IDRX amount to sell (provide this or usdtAmount).
- name: usdtAmount
in: query
schema:
type: string
description: USDT/USDC amount to sell (provide this or idrxAmount).
- name: chainId
in: query
schema:
type: string
default: '137'
responses:
'200':
description: Rate quote.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
type: object
properties:
price:
type: string
buyAmount:
type: string
chainId:
type: integer
quote:
type: object
'401':
$ref: '#/components/responses/Unauthorized'
/api/transaction/get-additional-fees:
get:
operationId: getAdditionalFees
tags:
- Transaction
summary: Get additional fees
description: Get additional fees for a transaction type (MINT, REDEEM, REFUND) on a chain.
parameters:
- name: feeType
in: query
required: true
schema:
type: string
enum:
- MINT
- REDEEM
- REFUND
- name: chainId
in: query
schema:
type: string
responses:
'200':
description: Additional fee list.
content:
application/json:
schema:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
amount:
type: string
isActive:
type: boolean
deleted:
type: boolean
'401':
$ref: '#/components/responses/Unauthorized'
components:
responses:
Forbidden:
description: Blocked User-Agent — set a custom User-Agent like my-app/1.0 (Cloudflare 1010).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Bad signature or timestamp drift — recompute signature and sync clock (NTP).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: Rate limit — back off and retry.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Invalid parameter — check param types and limits.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unprocessable:
description: Unsupported channelId for merchant — contact support@idrx.co to enable.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
RedeemRequest:
type: object
properties:
id:
type: integer
chainId:
type: integer
userId:
type: integer
requester:
type: string
txHash:
type: string
fromAddress:
type: string
amount:
type: string
bankName:
type: string
bankCode:
type: string
bankAccountNumber:
type: string
bankAccountName:
type: string
custRefNumber:
type: string
disburseId:
type: integer
burnStatus:
type: string
enum:
- REQUESTED
- PROCESSING
- PROCESSED
- REJECTED
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
deleted:
type: boolean
BridgeRequest:
type: object
properties:
id:
type: integer
userId:
type: integer
bridgeFromChainId:
type: integer
bridgeToChainId:
type: integer
txHashBurn:
type: string
txHashMint:
type:
- string
- 'null'
qredoTxId:
type:
- string
- 'null'
signedTx:
type:
- string
- 'null'
bridgeNonce:
type: string
amount:
type: string
bridgeStatus:
type: string
enum:
- REQUESTED
- PROCESSING
- PROCESSED
- REJECTED
deleted:
type: boolean
Error:
type: object
properties:
statusCode:
type: integer
message:
type: string
data:
type: 'null'
securitySchemes:
idrxApiKey:
type: apiKey
in: header
name: idrx-api-key
description: API key issued by IDRX. Each request must also carry `idrx-api-sig` (an HMAC-SHA256 signature) and `idrx-api-ts` (Unix ms timestamp), plus a custom `User-Agent`. Signature = HMAC-SHA256(secret, METHOD + ":" + PATH + ":" + SHA256(body) + ":" + timestamp).