Skip to main content

[POST] /external/v1/withdrawal-intents

Overview

Creates a withdrawal intent for the authenticated merchant.

Authentication

Requires an API key. See Authentication.

Request Body

FieldTypeRequiredDescription
senderWalletIdstringYesSource wallet ID to debit. Use a wallet id returned by the wallet list or retrieve endpoints. e.g: WT0ir6F1
serviceFeeModestringYesDetermines whether the service fee is included in or added on top of amount. Allowed values: inclusive, exclusive.
currencyCodestringYesCurrency code for the withdrawal amount. Allowed value: USDT.
amountNumericStringYesWithdrawal amount. Send this value as a string with up to 2 decimal places. e.g. "100.32"
destinationCreateWithdrawalDestinationYesDestination that receives the withdrawal.

Service Fee Mode

serviceFeeMode determines how the service fee is applied to amount.

ValueDescription
inclusiveThe service fee is deducted from amount.
exclusiveThe service fee is charged in addition to amount.

For example, if amount is 100 and amountFee is 1:

ModeamountNetamountGross
inclusive99100
exclusive100101

CreateWithdrawalDestination

FieldTypeRequiredDescription
typestringYesDestination type. Allowed value: crypto.
railstringYesDestination rail. Allowed value: tron.
identifierstringYesDestination identifier. For the Tron rail, this is the recipient Tron address. e.g TQPipjn73wBnKDodCtZAUCLoMdsgjBc3K5

Supported Destinations

CurrencyDestination TypeRailIdentifier
USDTcryptotronTron address

Response

Returns an ApiResponse<WithdrawalIntent>.

FieldTypeDescription
codestringResponse code. Successful responses use ok.
messagestringHuman-readable response message.
dataWithdrawalIntentCreated withdrawal intent.

Example Request

POST /external/v1/withdrawal-intents
Content-Type: application/json

{
"senderWalletId": "WT0ir6F1",
"serviceFeeMode": "inclusive",
"currencyCode": "USDT",
"amount": "100",
"destination": {
"type": "crypto",
"rail": "tron",
"identifier": "TJScotwGB69dbkzgEnjw5rKaeehxzv8pax"
}
}

Example Response

{
"code": "ok",
"message": "Ok.",
"data": {
"id": "WI_rSCtIlp0",
"wallet": {
"id": "WT0ir6F1",
"type": "merchant_wallet"
},
"transaction": null,
"destination": {
"type": "crypto",
"rail": "tron",
"routingCode": "tron:nile",
"identifier": "TJScotwGB69dbkzgEnjw5rKaeehxzv8pax"
},
"status": "preparing",
"serviceFeeMode": "inclusive",
"amount": "100.0000000000000000",
"amountFee": "1.0000000000000000",
"amountNet": "99.0000000000000000",
"amountGross": "100.0000000000000000",
"submittedAt": "2026-05-21T15:24:36.468Z",
"finalizedAt": null,
"createdAt": "2026-05-21T15:24:36.468Z",
"updatedAt": "2026-05-21T15:24:41.496Z"
}
}

Error Responses

All error responses use ErrorResponse.

HTTP StatusCodeMessageDescription
400data_invalidValidation error messageThe request body shape or field value does not match the API contract.
400withdrawal_intent.config_incompleteError messageWithdrawal configuration is incomplete, so the intent cannot be created.
400withdrawal_intent.destination_invalidError messageThe destination is outside the supported scope or failed validation.
400withdrawal_intent.destination_internalError messageThe destination points to an internal system endpoint and cannot be used as an external withdrawal destination.
400withdrawal_intent.service_fee_not_coveredNo withdrawable amount remains after the service fee.With inclusive mode, the service fee is equal to or greater than amount.
400withdrawal_intent.balance_insufficientError messageThe source wallet does not have enough available balance.
400withdrawal_intent.daily_limit_exceededError messageThe requested amount exceeds the daily withdrawal limit.
400withdrawal_intent.monthly_limit_exceededError messageThe requested amount exceeds the monthly withdrawal limit.
401unauthorizedUnauthorized.The API key is missing or invalid.
403forbiddenForbidden.The authenticated caller is not allowed to create this withdrawal intent.

Example Validation Error

{
"code": "data_invalid",
"message": "destination.rail must be tron",
"data": null
}