Spot Trading API
Spot trading API: accounts, orders, trades, and fee rates.
The spot trading API provides endpoints for managing spot trading accounts, placing and canceling orders, and retrieving trade history.
GET /spot/exchangeInfo
Retrieve exchange information including available spot markets and their details.
Authentication: Not required
maker_fee_rate and taker_fee_rate here are outdated. The values returned in exchangeInfo are static, indicative defaults and do not reflect the fees actually applied to your account (fee tiers, promotions, etc.). For the authoritative, account-specific rates always use GET /spot/account/market-fee-rate.
Response:
{
"timezone": "UTC",
"server_time": 1781702612915,
"assets": [
{
"asset": "ETH",
"name": "Ethereum",
"decimals": 17,
"display_precision": 8,
"is_stablecoin": false,
"min_withdraw_amount": "0.005"
},
{
"asset": "USDT",
"name": "Tether USD",
"decimals": 6,
"display_precision": 2,
"is_stablecoin": true,
"min_withdraw_amount": "5"
}
],
"symbols": [
{
"symbol": "ETHUSDT",
"status": "active",
"base_asset_name": "Ethereum",
"base_asset": "ETH",
"base_asset_precision": 17,
"quote_asset_name": "Tether USD",
"quote_asset": "USDT",
"quote_asset_precision": 6,
"amount_precision": 8,
"price_precision": 8,
"maker_fee_rate": "0.0008",
"taker_fee_rate": "0.001",
"market_order_slippage_tolerance": "0.050000",
"max_allowed_leverage": "",
"filters": [
{"filter_type": "DEPTH_MERGE", "config": {"depth_level": ["0.01", "0.1", "1", "10", "100"]}},
{"filter_type": "LOT_SIZE", "config": {"step_size": "0.001", "min_qty": "0.001", "max_qty": "50000"}},
{"filter_type": "MIN_NOTIONAL", "config": {"min_notional": "1"}},
{"filter_type": "PRICE_FILTER", "config": {"tick_size": "0.01", "min_price": "1000", "max_price": "100000"}}
]
}
]
}Response Fields:
timezone
string
Exchange timezone
server_time
integer
Current server timestamp in milliseconds
assets
array
Array of supported assets
assets[].asset
string
Asset symbol (e.g., "ETH")
assets[].name
string
Human-readable asset name
assets[].decimals
integer
On-chain token decimals
assets[].display_precision
integer
Display precision for the asset in UI
assets[].is_stablecoin
boolean
Whether the asset is a stablecoin
assets[].min_withdraw_amount
decimal string
Minimum withdrawal amount for the asset
symbols
array
Array of available spot trading symbols
symbols[].symbol
string
Trading symbol name (e.g., "ETHUSDT")
symbols[].status
string
Market status (e.g., "active")
symbols[].base_asset_name
string
Display name for base asset
symbols[].base_asset
string
Base asset symbol (e.g., "ETH")
symbols[].base_asset_precision
integer
Decimal precision for base asset
symbols[].quote_asset_name
string
Display name for quote asset
symbols[].quote_asset
string
Quote asset symbol (e.g., "USDT")
symbols[].quote_asset_precision
integer
Decimal precision for quote asset
symbols[].amount_precision
integer
Decimal precision for amount (base asset)
symbols[].price_precision
integer
Decimal precision for price (quote asset)
symbols[].maker_fee_rate
decimal string
⚠️ Outdated — static indicative default, not your account's effective rate. Use GET /spot/account/market-fee-rate.
symbols[].taker_fee_rate
decimal string
⚠️ Outdated — static indicative default, not your account's effective rate. Use GET /spot/account/market-fee-rate.
symbols[].market_order_slippage_tolerance
decimal string
Max slippage tolerated for market orders on this symbol
symbols[].max_allowed_leverage
decimal string
Max allowed leverage (empty for spot)
symbols[].filters
array
Trading rules (PRICE_FILTER, LOT_SIZE, MIN_NOTIONAL, DEPTH_MERGE)
Status Codes:
200- Exchange information retrieved successfully500- Internal server error
GET /spot/networks
Retrieve supported blockchain networks and the tokens available for deposit and withdrawal on each network.
Authentication: Not required
Response:
Response Fields:
networks
array
Array of supported blockchain networks
networks[].chain_id
integer
EVM chain ID (e.g., 1 for Ethereum mainnet, 42161 for Arbitrum)
networks[].name
string
Human-readable network name
networks[].custody_address
string
Custody contract address on this network (deposit destination)
networks[].tokens
array
Array of tokens available on this network
networks[].tokens[].symbol
string
Asset symbol (e.g., "ETH", "USDC")
networks[].tokens[].contract_address
string
Token ERC-20 contract address (0x000...000 for native ETH)
networks[].tokens[].decimals
integer
On-chain token decimals
networks[].tokens[].can_deposit
boolean
Whether deposits are currently enabled for this token on this network
networks[].tokens[].can_withdraw
boolean
Whether withdrawals are currently enabled for this token on this network
Status Codes:
200- Networks retrieved successfully
GET /spot/accounts
Retrieve all spot accounts for the authenticated user.
Authentication: Required
Response:
Response Fields:
id
string
Unique spot account identifier (UUID)
app_session_id
string
Application session identifier
owner
string
Owner's Ethereum wallet address
balances
array
Array of balance objects
balances[].asset_symbol
string
Asset symbol (e.g., "BTC", "USDT")
balances[].asset_name
string
Human-readable asset display name (e.g., "Bitcoin")
balances[].total_balance
decimal string
Total balance (available + locked)
balances[].available_balance
decimal string
Balance available for trading
balances[].locked_balance
decimal string
Balance locked in open orders
balances[].total_balance_usd
decimal string
Total balance valued in stablecoin (USD/USDT); "0" when no price
balances[].available_balance_usd
decimal string
Available balance valued in stablecoin; "0" when no price
balances[].locked_balance_usd
decimal string
Locked balance valued in stablecoin; "0" when no price
balances[].last_updated
string
Last balance update timestamp
usdt_account_value
decimal string
Total account value in USDT
state
string
Account state (active, closed)
opened_at
string
Account creation timestamp
Status Codes:
200- Accounts retrieved successfully401- Authentication failed500- Internal server error
GET /spot/account
Retrieve information for a specific spot account.
Authentication: Required
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
asset
string
No
—
Exact asset symbol match on asset_symbol
asset_like
string
No
—
Case-insensitive substring (contains) match on asset_symbol
Request:
Response:
Status Codes:
200- Account retrieved successfully400- Missing app_session_id parameter401- Authentication failed404- Account not found500- Internal server error
GET /spot/account/market-fee-rate
Retrieve the effective spot maker/taker fee rates for a single market on a given account.
Authentication: Required (read:spot scope)
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
market
string
Yes
—
Trading market (e.g., "BTCUSDT")
Request:
Response:
Response Fields:
The response is a JSON array containing a single fee-rate object:
app_session_id
string
Spot account app session ID
market
string
Trading market
maker_fee_rate
decimal string
Effective maker fee rate
taker_fee_rate
decimal string
Effective taker fee rate
source
string
Origin of the applied fee rate (e.g., fee_tier)
fee_tier_version
integer
Version of the fee tier configuration applied
Status Codes:
200- Fee rates retrieved successfully400- Missingapp_session_idormarketparameter401- Authentication failed500- Internal server error
POST /spot/order
Create a new spot trading order.
Authentication: Required
Request Body:
Request Parameters:
app_session_id
string
Yes
—
Spot account app session ID
market
string
Yes
—
Trading market (e.g., "BTCUSDT", "ETHUSDC")
side
string
Yes
buy, sell
Order side
type
string
Yes
limit, market
Order type
amount
string
Yes
—
Order amount in base asset (decimal format)
price
string
No
—
Limit price (required for limit orders, ignored for market orders)
time_in_force
string
No
gtc (Good-Till-Cancelled), ioc (Immediate-Or-Cancel), fok (Fill-Or-Kill); defaults to GTC for limit orders, IOC for market orders
Time in force
trigger_price
string
No
—
Trigger price for stop/trigger order types (decimal string)
Response:
Response Fields:
order_uuid
string
UUID of the created order
Status Codes:
200- Order created successfully400- Invalid request parameters or validation failed (for example, insufficient balance)401- Authentication failed500- Internal server error
Error response (typical for 400):
error: Machine-readable error code (snake_case), e.g.insufficient_balance.message: Human-readable detail.
DELETE /spot/order
Cancel an existing spot order.
Authentication: Required
Request Body:
Request Parameters:
app_session_id
string
Yes
—
Spot account app session ID
market
string
Yes
—
Trading market
order_uuid
string
Yes
—
UUID of the order to cancel
type
string
Yes
—
Order type
Response:
Status Codes:
200- Cancellation request sent successfully400- Invalid request or missing parameters401- Authentication failed500- Internal server error
DELETE /spot/orders
Cancel all open spot orders for an account, optionally limited to a single market.
Authentication: Required (trade:spot scope)
Request Body:
Request Parameters:
app_session_id
string
Yes
—
Spot account app session ID
market
string
No
—
Trading market. When provided, only open orders for that market are cancelled; when omitted, open orders across all markets are cancelled.
Response:
When there are no open orders to cancel:
Response Fields:
message
string
Human-readable summary of the cancellation request
canceled_count
integer
Number of orders for which a cancellation request was sent
failed_count
integer
Number of orders whose cancellation request could not be sent (omitted when there were no open orders)
Status Codes:
200- Cancellation requests sent (or no open orders to cancel)400- Invalid request body or missingapp_session_id401- Authentication failed403- Not authorized to cancel orders for this account404- Spot account not found500- Internal server error
GET /spot/open_orders
Retrieve open spot orders with cursor pagination.
Authentication: Required
Pagination: Spot list endpoints use cursor-based pagination. See Pagination for the shared model.
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
asset
string
No
—
Case-insensitive fuzzy filter on asset_symbol (contains match)
market
string
No
—
Filter by trading market
use_cursor
boolean
No
—
Set true to use cursor pagination (use on the first request).
cursor
string
No
—
Opaque continuation token from the previous response's next_cursor. Omit on the first page.
page_size
integer
No
default 50, max 100
Number of orders per page
Request (first page):
Request (next page):
Response:
Response Fields:
orders
array
Array of order objects
orders[].id
string
Internal order record ID
orders[].order_id
string
Order UUID
orders[].channel_id
string
Spot account app session ID
orders[].market
string
Trading market
orders[].price
decimal string
Order price
orders[].amount
decimal string
Current order amount (may be partially filled)
orders[].origin_amount
decimal string
Original order amount
orders[].notional
decimal string
Notional value (amount x price)
orders[].side
string
Order side (buy or sell)
orders[].type
string
Order type (limit or market)
orders[].state
string
Order state (wait, done, canceled)
orders[].event
string
Last order event (empty string)
orders[].reason
string
Reason for last state change (empty string)
orders[].created_at
string
Order creation timestamp
orders[].updated_at
string
Last update timestamp
orders[].completed_at
string
Completion timestamp (empty for open orders)
next_cursor
string
Token to pass as cursor for the next page; empty when no more pages
has_more
boolean
Whether another page exists
page_size
integer
Number of orders per page
Status Codes:
200- Orders retrieved successfully400- Invalid query parameters (including malformedcursor)401- Authentication failed500- Internal server error
GET /spot/orders
Retrieve spot order history with cursor pagination.
Authentication: Required
Pagination: This endpoint uses cursor-based pagination. See Pagination.
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
market
string
No
—
Filter by trading market
use_cursor
boolean
No
—
Set true to use cursor pagination (use on the first request).
cursor
string
No
—
Opaque continuation token from the previous response's next_cursor. Omit on the first page.
page_size
integer
No
default 50, max 100
Number of orders per page
Request (first page):
Request (next page):
Response: Same format as /spot/open_orders but includes all orders (open, filled, and cancelled)
Status Codes:
200- Orders retrieved successfully400- Invalid query parameters (including malformedcursor)401- Authentication failed500- Internal server error
GET /spot/trades
Retrieve spot trade history with cursor pagination.
Authentication: Required
Pagination: This endpoint uses cursor-based pagination. See Pagination.
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
market
string
No
—
Filter by trading market
use_cursor
boolean
No
—
Set true to use cursor pagination (use on the first request).
cursor
string
No
—
Opaque continuation token from the previous response's next_cursor. Omit on the first page.
page_size
integer
No
default 50, max 100
Number of trades per page
Request (first page):
Request (next page):
Response:
Response Fields:
trades
array
Array of trade objects
trades[].id
string
Internal trade record ID
trades[].order_id
string
User's own order ID in this trade (numeric)
trades[].market
string
Trading market
trades[].amount
decimal string
Trade amount in base asset
trades[].price
decimal string
Trade execution price
trades[].is_buyer
boolean
Whether the user was the buyer in this trade
trades[].is_maker
boolean
Whether the user was the maker (liquidity provider) in this trade
trades[].executed_at
string
Trade execution timestamp
trades[].created_at
string
Trade record creation timestamp
next_cursor
string
Token to pass as cursor for the next page; empty when no more pages
has_more
boolean
Whether another page exists
page_size
integer
Number of trades per page
Note: The API response only exposes the user's own order ID and does not expose counterparty information for privacy reasons. It provides user-relative flags (is_buyer, is_maker) to indicate the user's role in the trade.
Status Codes:
200- Trades retrieved successfully400- Invalid query parameters (including malformedcursor)401- Authentication failed500- Internal server error
GET /spot/deposits
Retrieve spot deposit history with cursor pagination.
Authentication: Required
Pagination: This endpoint uses cursor-based pagination. See Pagination.
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
use_cursor
boolean
No
—
Set true to use cursor pagination (use on the first request).
cursor
string
No
—
Opaque continuation token from the previous response's next_cursor. Omit on the first page.
page_size
integer
No
default 50, max 100
Number of deposits per page
Request (first page):
Request (next page):
Response:
Response Fields:
deposits
array
Array of deposit objects
deposits[].spot_account_id
string
Spot account ID (UUID)
deposits[].asset_symbol
string
Asset symbol (e.g., "USDT", "BTC")
deposits[].amount
decimal string
Deposit amount
deposits[].transaction_hash
string
On-chain transaction hash
deposits[].created_at
string
Record creation timestamp
deposits[].deposited_at
string
Timestamp when deposit occurred
deposits[].chain_id
integer
Blockchain chain ID where the deposit was received (e.g., 1 for Ethereum, 42161 for Arbitrum)
next_cursor
string
Token to pass as cursor for the next page; empty when no more pages
has_more
boolean
Whether another page exists
page_size
integer
Number of deposits per page
Status Codes:
200- Deposits retrieved successfully400- Missing app_session_id parameter401- Authentication failed500- Internal server error
GET /spot/withdrawals
Retrieve spot withdrawal history with cursor pagination.
Authentication: Required
Pagination: This endpoint uses cursor-based pagination. See Pagination.
Query Parameters:
app_session_id
string
Yes
—
Spot account app session ID
use_cursor
boolean
No
—
Set true to use cursor pagination (use on the first request).
cursor
string
No
—
Opaque continuation token from the previous response's next_cursor. Omit on the first page.
page_size
integer
No
default 50, max 100
Number of withdrawals per page
Request (first page):
Request (next page):
Response:
Response Fields:
withdrawals
array
Array of withdrawal objects
withdrawals[].id
string
Withdrawal ID (UUID)
withdrawals[].spot_account_id
string
Spot account ID (UUID)
withdrawals[].asset_symbol
string
Asset symbol (e.g., "USDT", "BTC")
withdrawals[].amount
decimal string
Withdrawal amount
withdrawals[].status
string
Withdrawal status (pending, completed, failed)
withdrawals[].transaction_hash
string
On-chain transaction hash (when completed)
withdrawals[].failure_reason
string
Reason for failure (when status is failed)
withdrawals[].requested_at
string
Timestamp when withdrawal was requested
withdrawals[].completed_at
string
Timestamp when withdrawal completed (or failed)
withdrawals[].created_at
string
Record creation timestamp
withdrawals[].chain_id
integer
Blockchain chain ID where the withdrawal was executed (e.g., 1 for Ethereum, 42161 for Arbitrum)
next_cursor
string
Token to pass as cursor for the next page; empty when no more pages
has_more
boolean
Whether another page exists
page_size
integer
Number of withdrawals per page
Status Codes:
200- Withdrawals retrieved successfully400- Missing app_session_id parameter401- Authentication failed500- Internal server error
POST /spot/withdrawal
Request a new spot withdrawal.
Authentication: Required
Known Issue: Server returns 500 instead of 400 when withdrawal amount exceeds available balance.
Request Body:
Request Parameters:
app_session_id
string
Yes
—
Spot account app session ID
asset_symbol
string
Yes
—
Asset to withdraw (e.g., "USDT", "BTC")
amount
string
Yes
must be positive
Amount to withdraw (decimal format)
chain_id
integer
No
default: server-configured default chain
Target blockchain chain ID for the withdrawal (e.g., 1 for Ethereum, 42161 for Arbitrum). Use GET /spot/networks to discover available chains. When omitted, falls back to the server-configured default chain. Returns 400 if omitted and no default is configured.
Response:
Response Fields:
withdrawal_id
string
UUID of the withdrawal request
status
string
Initial status (pending)
message
string
Confirmation message
Status Codes:
200- Withdrawal request accepted400- Invalid request or insufficient funds401- Authentication failed500- Internal server error
Last updated
Was this helpful?