Quote a withdrawal
Estimates the on-chain fee for the supplied withdrawal and returns a short-lived quoteId plus a fee breakdown. The quote does not reserve any balance and expires in ~60s. Submit the quoteId to POST /withdrawal/commit to actually create the withdrawal.
Required scope: withdrawals.create.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Currency code.
Example
USDT_TRC20Destination wallet address
Withdrawal amount in cryptoCurrencyCode
Example
100If true and the withdrawal-asset balance is short of amount + on-chain fee, the quote may add a currency_conversion to top up that balance ($0.5 USD flat commission in the source currency) before a normal same-currency withdrawal. Commit reuses the locked currency_conversion row.
Merchant idempotency key, scoped to (tenant, account). Two quote requests sharing an orderId collapse to the same quote, and the pair (orderId, account) can ever back at most one committed withdrawal - re-quoting after commit fails with 409.
Responses
Section titled “Responses”object
object
Opaque quote id; submit to POST /withdrawal/commit to commit.
Echo of the merchant orderId supplied at quote time. The merchant should persist this against their order so support tickets and webhooks correlate cleanly.
Currency code.
Echo of address
Echo of amount - denominated in cryptoCurrencyCode (this is what reaches the destination address).
When present, a virtual conversion is locked to top up the withdrawal asset before the withdrawal debit. Commission is in fromAssetCode.
object
Asset code.
Asset code.
Total to debit in cryptoCurrencyCode at commit (on-chain amount + on-chain fee component in the withdrawal asset).
object
Real on-chain fee, in network base currency (e.g. ETH/TRX/BNB/BTC)
Network base currency symbol
On-chain fee at quote time, expressed in the withdrawal cryptoCurrencyCode.
Fee snapshotted to USD at quote time
ISO timestamp after which the quote can no longer be committed. Re-issue a new quote if expired.
Example
{ "data": { "cryptoCurrencyCode": "USDT_TRC20", "autoConvert": { "fromAssetCode": "USDT", "toAssetCode": "USDT" } }}Validation error, currency/address mismatch, or below-minimum amount.
Missing or invalid x-tenant-api-key header. Code: exceptions.auth.invalidApiKey.
object
Stable machine-readable error code, namespaced under exceptions.. Always prefer branching on this value over message. See the per-route descriptions for the codes that route emits.
Human-readable explanation. Subject to wording changes; for programmatic checks use code instead.
Optional structured payload accompanying the error. For exceptions.rateLimit.exceeded includes msBeforeNext; for validation errors includes the offending field info.
object
Example
{ "code": "exceptions.auth.invalidApiKey", "message": "Invalid or missing API key"}Request origin IP is not on the tenant API allowlist (exceptions.auth.ipNotAllowed), or the API key is missing the scope required by this operation (exceptions.auth.insufficientScope).
object
Stable machine-readable error code, namespaced under exceptions.. Always prefer branching on this value over message. See the per-route descriptions for the codes that route emits.
Human-readable explanation. Subject to wording changes; for programmatic checks use code instead.
Optional structured payload accompanying the error. For exceptions.rateLimit.exceeded includes msBeforeNext; for validation errors includes the offending field info.
object
Example
{ "code": "exceptions.auth.invalidApiKey", "message": "Invalid or missing API key"}Rate limit exceeded for this endpoint. Retry after the window resets. Code: exceptions.rateLimit.exceeded. The extension.msBeforeNext field tells you how long to wait.
object
Stable machine-readable error code, namespaced under exceptions.. Always prefer branching on this value over message. See the per-route descriptions for the codes that route emits.
Human-readable explanation. Subject to wording changes; for programmatic checks use code instead.
Optional structured payload accompanying the error. For exceptions.rateLimit.exceeded includes msBeforeNext; for validation errors includes the offending field info.
object
Example
{ "code": "exceptions.auth.invalidApiKey", "message": "Invalid or missing API key"}Unexpected server error. Safe to retry idempotent operations after a backoff.
object
Stable machine-readable error code, namespaced under exceptions.. Always prefer branching on this value over message. See the per-route descriptions for the codes that route emits.
Human-readable explanation. Subject to wording changes; for programmatic checks use code instead.
Optional structured payload accompanying the error. For exceptions.rateLimit.exceeded includes msBeforeNext; for validation errors includes the offending field info.
object
Example
{ "code": "exceptions.auth.invalidApiKey", "message": "Invalid or missing API key"}