Skip to content

Withdrawals ​

Withdrawals: create and query

Status: REQUESTING (pending review) → PENDING (approved, signing / broadcasting) → BROADCASTED (broadcast, confirming) → CONFIRMED; other final states are REJECTED (review rejected) and FAILED. Each transition into BROADCASTED / CONFIRMED / FAILED / REJECTED emits an event (withdraw.broadcasted / confirmed / failed / rejected) whose data equals GET /v1/withdraws/{withdraw_id}.

List withdrawals ​

http
GET /v1/withdraws

API key scope: read

List withdrawals: ordered by withdraw_id descending, cursor pagination; look up your own order number with biz_id

Parameters

NameInTypeRequiredDescription
user_idquerystringnoUser ID: optional
biz_idquerystringnoMerchant order number: optional
chain_codequerystringnoChain code: optional
token_codequerystringnoToken code: optional
statusquerystringnoStatus: optional
tx_hashquerystringnoTransaction hash: optional
start_timequerystringnoStart time: by creation time, Unix milliseconds, inclusive
end_timequerystringnoEnd time: by creation time, Unix milliseconds, inclusive
page_sizequeryintegernoPage size: default 20, max 100 (larger values are treated as 100)
page_tokenquerystringnoPage token: the next_page_token from the previous page; omit for the first page. Opaque — pass it back unchanged

Response (200, WithdrawPage)

FieldTypeDescription
next_page_tokenstringpage_token for the next page; empty means no more pages
withdrawsobject (Withdraw)[]
withdraws[].amountstringAmount (main unit) actually sent on-chain
withdraws[].amount_rawstringAmount (integer, smallest unit)
withdraws[].biz_idstringMerchant order number
withdraws[].block_numberstring
withdraws[].broadcast_timestringBroadcast time (Unix milliseconds); 0 if not broadcast
withdraws[].chain_codestring
withdraws[].confirm_timestringConfirmation time (Unix milliseconds); 0 if not confirmed
withdraws[].confirmationsinteger
withdraws[].create_timestringCreation time (Unix milliseconds)
withdraws[].decimalsinteger
withdraws[].feestringFee (main unit), charged off-chain
withdraws[].from_addressstringOutbound hot wallet address: set after approval; empty for in-pool transfers
withdraws[].internalbooleanWhether it is an in-pool transfer (both sides are pooled merchants; not on-chain, instant)
withdraws[].reasonstringFailure or rejection reason (set when FAILED / REJECTED)
withdraws[].statusstringREQUESTING / PENDING / BROADCASTED / CONFIRMED / REJECTED / FAILED
withdraws[].to_addressstring
withdraws[].token_codestring
withdraws[].tx_hashstringOn-chain transaction hash: set after signing; empty for in-pool transfers
withdraws[].user_idstring
withdraws[].withdraw_idstring

Response example:

json
{
  "next_page_token": "",
  "withdraws": [
    {
      "amount": "12.5",
      "amount_raw": "12500000",
      "biz_id": "order-20261109-0001",
      "block_number": "77123456",
      "broadcast_time": "1762650000000",
      "chain_code": "TRON",
      "confirm_time": "1762650000000",
      "confirmations": 0,
      "create_time": "1762650000000",
      "decimals": 6,
      "fee": "",
      "from_address": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
      "internal": false,
      "reason": "AMOUNT_BELOW_MIN",
      "status": "REQUESTING",
      "to_address": "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
      "token_code": "USDT",
      "tx_hash": "3f1c0e…(交易哈希)",
      "user_id": "u_10001",
      "withdraw_id": "1987654321098753"
    }
  ]
}

On failure the unified error body is returned; see Errors.

Create withdrawal ​

http
POST /v1/withdraws

API key scope: withdraw

Create withdrawal: withdrawals to external addresses go to manual review; between two pooled merchants it is an in-pool transfer (instant, not on-chain)

Request body

FieldTypeDescription
amountstringAmount in the main unit, e.g. 12.5
biz_idstringBusiness order number: the merchant-side idempotency key, unique per merchant
chain_codestringChain code, e.g. TRON / ETH / BSC
force_onchainbooleanForce on-chain: when the destination is another address in the platform pool, the default is an in-pool transfer (instant, no gas, no fee); true sends it on-chain as a normal withdrawal
to_addressstringDestination address
token_codestringToken, e.g. USDT
user_idstringUser ID: the merchant's own user identifier

Request example:

json
{
  "amount": "12.5",
  "biz_id": "order-20261109-0001",
  "chain_code": "TRON",
  "force_onchain": false,
  "to_address": "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
  "token_code": "USDT",
  "user_id": "u_10001"
}

Response (200, Withdraw)

FieldTypeDescription
amountstringAmount (main unit) actually sent on-chain
amount_rawstringAmount (integer, smallest unit)
biz_idstringMerchant order number
block_numberstring
broadcast_timestringBroadcast time (Unix milliseconds); 0 if not broadcast
chain_codestring
confirm_timestringConfirmation time (Unix milliseconds); 0 if not confirmed
confirmationsinteger
create_timestringCreation time (Unix milliseconds)
decimalsinteger
feestringFee (main unit), charged off-chain
from_addressstringOutbound hot wallet address: set after approval; empty for in-pool transfers
internalbooleanWhether it is an in-pool transfer (both sides are pooled merchants; not on-chain, instant)
reasonstringFailure or rejection reason (set when FAILED / REJECTED)
statusstringREQUESTING / PENDING / BROADCASTED / CONFIRMED / REJECTED / FAILED
to_addressstring
token_codestring
tx_hashstringOn-chain transaction hash: set after signing; empty for in-pool transfers
user_idstring
withdraw_idstring

Response example:

json
{
  "amount": "12.5",
  "amount_raw": "12500000",
  "biz_id": "order-20261109-0001",
  "block_number": "77123456",
  "broadcast_time": "1762650000000",
  "chain_code": "TRON",
  "confirm_time": "1762650000000",
  "confirmations": 0,
  "create_time": "1762650000000",
  "decimals": 6,
  "fee": "",
  "from_address": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "internal": false,
  "reason": "AMOUNT_BELOW_MIN",
  "status": "REQUESTING",
  "to_address": "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
  "token_code": "USDT",
  "tx_hash": "3f1c0e…(交易哈希)",
  "user_id": "u_10001",
  "withdraw_id": "1987654321098753"
}

On failure the unified error body is returned; see Errors.

Get withdrawal ​

http
GET /v1/withdraws/{withdraw_id}

API key scope: read

Get withdrawal

Parameters

NameInTypeRequiredDescription
withdraw_idpathstringyesWithdrawal ID

Response (200, Withdraw)

FieldTypeDescription
amountstringAmount (main unit) actually sent on-chain
amount_rawstringAmount (integer, smallest unit)
biz_idstringMerchant order number
block_numberstring
broadcast_timestringBroadcast time (Unix milliseconds); 0 if not broadcast
chain_codestring
confirm_timestringConfirmation time (Unix milliseconds); 0 if not confirmed
confirmationsinteger
create_timestringCreation time (Unix milliseconds)
decimalsinteger
feestringFee (main unit), charged off-chain
from_addressstringOutbound hot wallet address: set after approval; empty for in-pool transfers
internalbooleanWhether it is an in-pool transfer (both sides are pooled merchants; not on-chain, instant)
reasonstringFailure or rejection reason (set when FAILED / REJECTED)
statusstringREQUESTING / PENDING / BROADCASTED / CONFIRMED / REJECTED / FAILED
to_addressstring
token_codestring
tx_hashstringOn-chain transaction hash: set after signing; empty for in-pool transfers
user_idstring
withdraw_idstring

Response example:

json
{
  "amount": "12.5",
  "amount_raw": "12500000",
  "biz_id": "order-20261109-0001",
  "block_number": "77123456",
  "broadcast_time": "1762650000000",
  "chain_code": "TRON",
  "confirm_time": "1762650000000",
  "confirmations": 0,
  "create_time": "1762650000000",
  "decimals": 6,
  "fee": "",
  "from_address": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "internal": false,
  "reason": "AMOUNT_BELOW_MIN",
  "status": "REQUESTING",
  "to_address": "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
  "token_code": "USDT",
  "tx_hash": "3f1c0e…(交易哈希)",
  "user_id": "u_10001",
  "withdraw_id": "1987654321098753"
}

On failure the unified error body is returned; see Errors.