Skip to content

Withdrawals API Reference ​

All withdrawal endpoints are mounted at /v1/withdrawals and accept X-API-Key. Settlements are always in USDT; withdrawals are currently manual and USDT-only, processed via the platform's configured exchange. Decimal amounts are returned as JSON strings.

Endpoints summary ​

MethodPathDescription
GET/v1/withdrawals/balanceBalance summary (total / reserved / available)
GET/v1/withdrawals/chainsChains where USDT withdrawals are supported
GET/v1/withdrawals/walletsList configured withdrawal wallets
PUT/v1/withdrawals/wallets/{chain_id}Create or update the wallet for a chain
DELETE/v1/withdrawals/wallets/{chain_id}Remove a wallet (204)
GET/v1/withdrawals/fee-estimateFee + minimum withdrawal for a chain
POST/v1/withdrawals/requestCreate a withdrawal request (Basic KYC)
GET/v1/withdrawalsList withdrawals (paginated)
GET/v1/withdrawals/{withdrawal_id}Withdrawal detail

GET /v1/withdrawals/balance ​

Response (200 OK):

json
{
  "success": true,
  "data": {
    "balance_usd": "147.75",
    "reserved_usd": "0.00",
    "available_usd": "147.75"
  }
}
  • balance_usd — ledger credits minus debits
  • reserved_usd — amounts locked by withdrawals pending admin approval
  • available_usd — amount you can request right now

GET /v1/withdrawals/chains ​

Returns chains where the active exchange supports USDT withdrawals and USDT is active.

Response (200 OK):

json
{
  "success": true,
  "data": {
    "chains": [
      { "id": "...", "name": "Ethereum", "short_name": "eth", "chain_type": "evm", "logo_url": "https://..." }
    ]
  }
}

PUT /v1/withdrawals/wallets/ ​

Request body:

FieldTypeRequiredDescription
addressstringYesDestination wallet address on the chain
labelstringNoOptional label

Response (200 OK):

json
{
  "success": true,
  "data": {
    "id": "...",
    "chain": { "id": "...", "name": "Ethereum", "short_name": "eth", "chain_type": "evm" },
    "address": "0xyourwallet...",
    "label": "Cold wallet",
    "created_at": "2026-05-16T10:00:00Z"
  }
}

There is one wallet per chain — re-PUT to replace the address.

GET /v1/withdrawals/fee-estimate ​

Query parameter: chain_id (UUID, required).

Response (200 OK):

json
{
  "success": true,
  "data": {
    "chain": { "id": "...", "name": "Ethereum", "short_name": "eth", "chain_type": "evm" },
    "fee_usd": "1.00",
    "min_withdrawal_usd": "10.00"
  }
}

POST /v1/withdrawals/request ​

Create a manual withdrawal request. Requires Basic KYC.

Request body:

FieldTypeRequiredDescription
chain_idUUIDYesChain to withdraw on (must have a configured wallet)
amount_usddecimalYesGross amount; must be ≥ minimum and above the fee
totp_codestringOnly if 2FA enabled6-digit TOTP code or a backup code

Response (201 Created):

json
{
  "success": true,
  "data": {
    "id": "w1x2y3z4-...",
    "chain": { "id": "...", "name": "Ethereum", "short_name": "eth", "chain_type": "evm" },
    "destination_address": "0xyourwallet...",
    "amount_usd": "147.75",
    "fee_usd": "1.00",
    "net_amount_usd": "146.75",
    "source": "manual",
    "status": "pending_approval",
    "tx_hash": null,
    "created_at": "2026-05-16T14:00:00Z",
    "updated_at": "2026-05-16T14:00:00Z"
  }
}

Lifecycle: pending_approval → (admin approves) processing → completed, or rejected / failed.

Error codes:

CodeCondition
KYC_REQUIREDKYC level below Basic
UNAUTHORIZED2FA enabled but totp_code missing or invalid
VALIDATION_ERRORNo wallet configured; chain not supported for USDT withdrawal; below minimum; net amount ≤ 0 after fee; daily limit (Basic KYC, default $50k/24h) would be exceeded
INSUFFICIENT_FUNDSAmount exceeds available balance

GET /v1/withdrawals ​

Query parameters: status (string), page (default 1), page_size (default 20, max 100).

Response (200 OK):

json
{
  "success": true,
  "data": {
    "total": 12,
    "page": 1,
    "page_size": 20,
    "total_pages": 1,
    "withdrawals": [
      {
        "id": "w1x2y3z4-...",
        "chain": { "id": "...", "name": "Ethereum", "short_name": "eth", "chain_type": "evm" },
        "destination_address": "0xyourwallet...",
        "amount_usd": "147.75",
        "fee_usd": "1.00",
        "net_amount_usd": "146.75",
        "source": "manual",
        "status": "completed",
        "tx_hash": "0xwithdrawal...",
        "created_at": "2026-05-16T14:00:00Z",
        "completed_at": "2026-05-16T15:00:00Z"
      }
    ]
  }
}

GET /v1/withdrawals/ ​

Full withdrawal detail, including rejection_reason / failure_reason and review/processing timestamps. Returns NOT_FOUND if the withdrawal is not yours.

TokenCashFlow Documentation