Private Channels Overview
Private channels provide access to account-specific data and trading operations. All private channels require authentication via a valid JWT token.
- BALANCE - Real-time account balance updates
- CLIENT_BALANCE_DISTRIBUTION - Per-exchange breakdown of where each asset is held
- TRADE_PRIVATE - Private trades and order management
- TRADE_POSITIONS - Current trading positions
- RFQ POST - Request for Quote functionality
Real-time balance updates for specified currencies. Provides both snapshot and incremental updates.
{
"command": "SUBSCRIBE",
"signature": "valid_signature",
"channel": "BALANCE",
"channelArgs": [
{
"name": "currency",
"value": "[USD,ADA,ETH,BTC]"
}
]
}
{
"command": "SUBSCRIBE",
"event": "ACK",
"channel": "BALANCE"
}
{
"command": "SUBSCRIBE",
"event": "SNAPSHOT",
"channel": "BALANCE",
"data": [
{
"class": "Balance",
"currencyCode": "ADA",
"balance": 16140.3555,
"available": 16040.3555,
"locked": 100.0
}
]
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "BALANCE",
"data": [
{
"class": "Balance",
"currencyCode": "ADA",
"balance": 16140.3555,
"available": 16040.3555,
"locked": 100.0
}
]
}
Where your tokens actually sit — a per-venue breakdown of every asset you hold, with cost basis, valuation and PnL for each venue. One time request/response; there is no subscription on this channel.
BALANCE channel reports one aggregate figure per currency across all venues, but an order is routed to exactly one exchange and is checked against that venue's balance alone. Read this channel to decide where an order can actually be filled, and how much can be withdrawn or transferred off a given venue.
{
"command": "GET",
"signature": "valid signature",
"channel": "CLIENT_BALANCE_DISTRIBUTION",
"channelArgs": [],
"data": []
}
channelArgs and data are ignored on this channel — send them empty. The client is taken from your token, so there is no clientId to supply and no way to request another account's distribution.
{
"command": "GET",
"event": "GET",
"channel": "CLIENT_BALANCE_DISTRIBUTION",
"channelArgs": [],
"data": [
{
"class": "ClientBalanceDistribution",
"clientId": 1000123,
"asset": "BTC",
"exchange": "OKEX",
"finalBalance": 0.35,
"costBasisUsd": 30642.7595,
"totalValueUsd": 30803.6502,
"inventoryValueUsd": 30642.7595,
"wap": 87550.7414,
"lockedAmount": 0.05,
"availableAmount": 0.3,
"unrealizedPnl": 160.8907,
"returnPercent": 0.525
},
{
"class": "ClientBalanceDistribution",
"clientId": 1000123,
"asset": "BTC",
"exchange": "BITGET",
"finalBalance": 0.12,
"costBasisUsd": 10866.089,
"totalValueUsd": 10561.2515,
"inventoryValueUsd": 10866.089,
"wap": 90550.7417,
"lockedAmount": 0.0,
"availableAmount": 0.12,
"unrealizedPnl": -304.8375,
"returnPercent": -2.8054
}
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
| clientId | Number | Your Open Trade client identifier, taken from the token. |
| asset | String | Asset code, e.g. BTC, USDT, GALA. |
| exchange | String | Venue holding the asset: OKEX, HUOBI, BITGET, BITMART, BINANCE, DERIBIT, LMAX, GEMINI, BLOCKCHAIN, OPENTRADE. |
| finalBalance | Number | Total amount of the asset held on that venue. |
| availableAmount | Number | Amount free to trade, withdraw or transfer from that venue. |
| lockedAmount | Number | Amount reserved on that venue, typically against open orders or a pending transfer. |
| wap | Number | Weighted average price paid for the holding on that venue, in USD. |
| costBasisUsd | Number | USD cost basis of the holding on that venue. |
| inventoryValueUsd | Number | USD value of the inventory carried for the position on that venue. |
| totalValueUsd | Number | Current USD market value of the holding on that venue. |
| unrealizedPnl | Number | Unrealized PnL on the holding, in USD. Negative when the position is under water. |
| returnPercent | Number | Return on the holding, in percent. |
finalBalance over the rows sharing an asset to reconcile against the BALANCE channel, and never assume a single row carries the whole position.
Private trades subscription will provide a snapshot of currently open ACTIVE orders and then updates via WebSocket.
{
"command": "SUBSCRIBE",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"channelArgs": [
{
"name": "instrument",
"value": "[BTC/USD,ETH/BTC]"
}
]
}
{
"command": "GET",
"event": "GET",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"orderId": "567567567",
"exchOrderId": "1668662119644",
"direction": "BUY",
"orderType": "LIMIT",
"orderStatus": "ACTIVE",
"price": 12000.0,
"filledPrice": 0.0,
"amount": 0.001,
"orderDateTime": "2022-11-09T18:19:29.644164Z",
"globalInstrumentCd": "BTC/USD",
"message": null
}
]
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"globalInstrumentCd": "BTC/USD",
"orderId": "0989876565",
"exchOrderId": "1652424613543121",
"direction": "SELL",
"orderType": "LIMIT",
"orderStatus": "NEW",
"price": "0.215",
"amount": "1.0",
"orderDateTime": "1652424613543121"
}
]
}
Get current list of open orders. One time request/response.
{
"command": "GET",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"channelArgs": [
{
"name": "category",
"value": "ACTIVE_ORDERS"
},
{
"name": "instrument",
"value": "[USD/ADA,ETH/BTC,BTC/USD,BTC/EUR]"
}
]
}
{
"command": "GET",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"channelArgs": [
{
"name": "category",
"value": "ACTIVE_ORDERS"
}
],
"data": [
{
"class": "Order",
"globalInstrumentCd": "BTC/USD",
"clientOrderId": "123456789",
"exchangeOrderId": "5464564"
}
]
}
User may post New LIMIT, MARKET, POST_ONLY, BUY_STOP, SELL_STOP, STOP_LOSS, TAKE_PROFIT orders via CREATE action.
Order Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| action | String | Yes | Create, Cancel, Modify |
| amount | Number | Yes | Quantity of the order |
| clientOrderId | String | Optional | Id of the order (must be unique, recommend Unix timestamp) |
| exchange | String | Optional | Name of exchange to send order to, such as BITFINEX, LMAX, OKX. If not provided, order will be set as SMART |
| globalInstrumentCd | String | Yes | Pair (BTC/USD, ...) |
| orderType | String | Yes | MARKET, LIMIT, POST_ONLY, BUY_STOP, SELL_STOP, STOP_LOSS, TAKE_PROFIT |
| price | Number | Yes | Price required always |
| timeInForce | String | Optional | GTC, GTD, GTT, FOK, IOC |
| direction | String | Yes | BUY or SELL |
Time In Force Options
- GTC - Good Till Cancelled (default; orders rest in the book for 90 days)
- GTD - Good Till Day (terminates at end of day, 4:59 PM NY time)
- GTT - Good Till Time (alive until a specific date; cannot exceed 90 days)
- FOK - Fill or Kill (fill the full amount immediately or nothing)
- IOC - Immediate or Cancel (fill any amount immediately, cancel the rest)
Order types
- MARKET - Buy or sell immediately at the best available price. No price guarantee.
- LIMIT - Buy or sell only at your specified price or better. Rests in the book until matched or cancelled. Price guaranteed; fill is not.
- POST_ONLY - Limit order that is rejected if it would match immediately. Guarantees you add liquidity (maker).
- BUY_STOP - Triggers a buy when price rises to or above the stop price. Used to enter long on a breakout, or to cover a short position when the market moves against you.
- SELL_STOP - Triggers a sell when price falls to or below the stop price. Used to enter short on a breakdown, or to exit a long position when the market falls.
- STOP_LOSS - Protective exit order. Closes an existing position at market once the stop price is hit, capping the loss on the trade.
- TAKE_PROFIT - Protective exit order. Closes an existing position once the target price is reached, locking in the gain.
{
"command": "CREATE",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"globalInstrumentCd": "BTC/USD",
"clientOrderId": "0989876565",
"direction": "SELL",
"orderType": "LIMIT",
"timeInForce": "GTC",
"price": "0.215",
"amount": "1.0"
}
]
}
{
"command": "CREATE",
"event": "ACK",
"channel": "TRADE_PRIVATE"
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "OrderUpdate",
"clientId": 100141,
"requestType": "SMART",
"tradeSide": "BUY",
"instrumentCd": "BTC/USD",
"exchangeOrderId": null,
"clientOrderId": "2222223333",
"transactionId": 1668897424879,
"orderRequestStatus": "ACCEPTED",
"message": "",
"key": "100141:BTC/USD:1275564715"
}
]
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "OrderUpdate",
"clientId": 100000,
"requestType": "SMART",
"instrumentCd": "BTC/USD",
"timeInForce": "GTC",
"exchangeOrderId": null,
"clientOrderId": "1234567896",
"transactionId": 0,
"orderRequestStatus": "REJECTED",
"message": "Request amount less than minimum order size",
"key": "100000:BTC/USD:1243828326"
}
]
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "ExecutionReport",
"clientId": 100141,
"transactionId": 1668127315108,
"instrumentCd": "BTC/USD",
"requestType": null,
"tradeSide": "BUY",
"orderType": "LIMIT",
"timeInForce": "GTC",
"exchangeOrderId": null,
"clientOrderId": "65656775333",
"requestedPrice": 19000.0,
"requestedAmount": 0.001,
"amountSent": 0.001,
"amountFilled": 0.001,
"orderRequestStatus": "COMPLETED",
"message": "",
"key": "100141:BTC/USD:1668127315108:-1088378359"
}
]
}
User may cancel existing orders; client may cancel one order by either including clientOrderId or exchangeOrderId if clientOrderId is not known. exchange and requestType: "DIRECT" are also required so the gateway knows which venue to route the cancel to.
exchange and requestType: "DIRECT" alongside the order identifier. Without these, the gateway may not be able to resolve which venue holds the order.
Cancel Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| action | String | Yes | Cancel |
| globalInstrumentCd | String | Yes | Pair [BTC/USD, ...] |
| clientOrderId | String | Conditional | The clientOrderId from the original order. One of clientOrderId or exchangeOrderId must be provided. |
| exchangeOrderId | String | Conditional | Order id assigned by the underlying exchange. Use when clientOrderId is not known. |
| exchange | String | Yes | The exchange the order lives on (e.g. HUOBI, OKEX, BITFINEX), as returned in the order's exchange field from Active Orders. Required to route the cancel to the correct venue. |
| requestType | String | Yes | DIRECT — pins the cancel to exchange above. Omitting this (or the exchange) can result in the request failing to resolve which venue to cancel on. |
- You must provide either clientOrderId or exchangeOrderId — at least one is required to identify the order.
- exchange and requestType: "DIRECT" are required in addition to the order identifier.
- If clientOrderId is provided, it is used (takes precedence over exchangeOrderId).
- If only exchangeOrderId is provided, that order is cancelled.
- If both are provided, clientOrderId wins; exchangeOrderId is ignored.
- If neither is provided, the request is rejected and no orders are cancelled.
{
"command": "CANCEL",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"globalInstrumentCd": "BTC/USD",
"clientOrderId": "7777",
"exchange": "HUOBI",
"requestType": "DIRECT"
// OR use exchangeOrderId instead of clientOrderId:
// "exchangeOrderId": "1668553243505"
}
]
}
{
"command": "CANCEL_REQUEST",
"event": "ACK",
"channel": "TRADE_PRIVATE"
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "OrderUpdate",
"clientId": 100141,
"requestType": "SMART",
"tradeSide": "BUY",
"instrumentCd": "BTC/USD",
"exchangeOrderId": null,
"clientOrderId": null,
"transactionId": 1668897424879,
"orderRequestStatus": "CANCELLED",
"message": "",
"key": "100141:BTC/USD:352908720"
}
]
}
Clients may update existing orders. Amount or Price can be modified. Client must use clientOrderId or exchangeOrderId. Only one parameter is needed and will be accepted.
Modify Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| action | String | Yes | Modify |
| clientOrderId | String | Yes | Id of the order |
| globalInstrumentCd | String | Yes | Pair (BTC/USD, ...) |
| exchangeOrderId | String | Yes* | Exchange order ID (*or use clientOrderId) |
| price | String | No | If price is not passed in, then it's not modified |
| amount | String | No | If amount is not passed in, then it's not modified |
{
"command": "MODIFY",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"globalInstrumentCd": "BTC/USD",
"orderId": "7777",
"price": "0.215",
"amount": "0.215"
}
]
}
Clients may request a list of PARTIALLY_FILLED, FILLED trades for a required time frame.
{
"command": "GET",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"channelArgs": [
{
"name": "category",
"value": "TRADES_HISTORY"
},
{
"name": "instrument",
"value": "[USD/ADA,ETH/BTC,BTC/USD,BTC/EUR]"
},
{
"name": "date-from",
"value": "2022-12-01T00:00:00"
},
{
"name": "date-to",
"value": "2022-12-14T22:30:00"
}
]
}
{
"command": "GET",
"event": "GET",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"clientOrderId": "4444444",
"exchangeOrderId": "1668553243505",
"direction": "BUY",
"orderType": "LIMIT",
"orderStatus": "FILLED",
"price": 12700.0,
"filledPrice": 12700.0,
"amount": 0.001,
"orderDateTime": "2022-11-10T02:36:52.505443Z",
"globalInstrumentCd": "BTC/USD",
"message": null
},
...
]
}
Clients may request a list of COMPLETED, REJECTED, PARTIALLY_FILLED, FILLED, EXPIRED order requests for a required time frame.
{
"command": "GET",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"channelArgs": [
{
"name": "category",
"value": "ORDERS_HISTORY"
},
{
"name": "instrument",
"value": "[USD/ADA,ETH/BTC,BTC/USD,BTC/EUR]"
},
{
"name": "date-from",
"value": "2022-12-01T00:00:00"
},
{
"name": "date-to",
"value": "2022-12-14T22:30:00"
},
{
"name": "status",
"value": "[COMPLETED,REJECTED,PARTIALLY_FILLED,FILLED,EXPIRED]"
}
]
}
Available Status Values
- COMPLETED - Order fully executed
- REJECTED - Order rejected by exchange
- PARTIALLY_FILLED - Order partially executed
- FILLED - Order completely filled
- EXPIRED - Order expired based on time in force
Get current trade positions with entry prices, volumes, and stop loss/take profit levels.
{
"command": "GET",
"signature": "valid signature",
"channel": "TRADE_POSITIONS"
}
{
"command": "GET",
"event": "GET",
"channel": "TRADE_POSITIONS",
"data": [
{
"class": "TradePosition",
"direction": "BUY",
"date": "2022-11-10",
"globalInstrumentCd": "BTC/USD",
"openPrice": 12700.0,
"entryPrice": 12700.0,
"posVolume": 0.001,
"currentSl": 10.0,
"currentTp": 10.0
},
...
]
}
Returns the client's deposit wallet addresses, one per supported asset. Use these addresses to fund your account via on-chain deposit.
{
"command": "GET",
"signature": "valid signature",
"channel": "DEPOSIT_WALLET",
"channelArgs": [],
"data": []
}
{
"command": "GET",
"event": "GET",
"channel": "DEPOSIT_WALLET",
"data": [
{
"class": "DepositWallet",
"id": 1000003606,
"clientId": 100882,
"symbol": "XRP",
"walletAddress": "rnSffMjADGXG9apHR6gjKz8THc1FtZGCov",
"status": "ACTIVE",
"comment": "tag: 1000003606",
"exchange": "OPENTRADE"
},
{
"class": "DepositWallet",
"id": 1000003615,
"clientId": 100882,
"symbol": "AAVE",
"walletAddress": "0x649590c78f702ed0cdeab07daf722673d2510afe",
"status": "ACTIVE",
"comment": null,
"exchange": "OPENTRADE"
},
...
]
}
- id – internal wallet identifier for this client/asset pair
- symbol – asset code the wallet accepts deposits for
- comment – carries the destination tag/memo when the asset requires one (e.g. XRP), otherwise
null - status – wallet status, e.g.
ACTIVE
Tracks the lifecycle of incoming on-chain deposits as they are detected, confirmed, and credited to your account. Query either currently running processes or a history of completed ones.
ACTIVE_PROCESSES or COMPLETED_PROCESSES. For COMPLETED_PROCESSES, 'removeFailed', 'date-from', 'date-to', 'page', and 'pageSize' are optional filters/pagination controls; 'removeFailed' excludes failed/errored processes from the result set when set to true.
Active Processes
{
"command": "GET",
"signature": "valid signature",
"channel": "DEPOSIT_WORKFLOW",
"channelArgs": [
{
"name": "category",
"value": "ACTIVE_PROCESSES"
}
]
}
Completed Processes
{
"command": "GET",
"signature": "valid signature",
"channel": "DEPOSIT_WORKFLOW",
"channelArgs": [
{
"name": "category",
"value": "COMPLETED_PROCESSES"
},
{
"name": "removeFailed",
"value": "true"
},
{
"name": "date-from",
"value": "2026-01-01"
},
{
"name": "date-to",
"value": "2026-07-14"
},
{
"name": "page",
"value": "0"
},
{
"name": "pageSize",
"value": "50"
}
]
}
{
"channel": "DEPOSIT_WORKFLOW",
"channelArgs": [ ... ],
"command": "GET",
"data": [
{
"class": "DepositWorkflow",
"walletAddress": "0x649590c78f702ed0cdeab07daf722673d2510afe",
"cryptoAssetCode": "USDT",
"transferAmount": 20.0002,
"feeAmount": 0.00001613542206867,
"feeAssetCode": "ETH",
"walletTransferId": "a31a5f77-1826-4e20-a416-ba282c4fd864",
"tag": null,
"processInstanceId": "96ece4ff-463e-11f1-af10-22add62dcf14",
"state": "Update Transfer Status - Complete",
"message": null,
"startTime": "2026-05-02T15:50:05.922Z",
"endTime": "2026-05-02T15:53:27.104Z",
"suspended": false,
"tokenPriceUsd": 0.9997792134,
"errorMessage": null
},
{
"class": "DepositWorkflow",
"walletAddress": "0x649590c78f702ed0cdeab07daf722673d2510afe",
"cryptoAssetCode": "ETH",
"transferAmount": 0.000811907277365572,
"feeAmount": null,
"feeAssetCode": null,
"walletTransferId": null,
"tag": null,
"processInstanceId": "b6a8edc5-44f0-11f1-bce8-7a2b3ca44423",
"state": "Check Deposit Amount",
"message": null,
"startTime": "2026-05-01T00:00:07.255Z",
"endTime": "2026-05-01T00:00:08.580Z",
"suspended": false,
"tokenPriceUsd": 2255.9838392777,
"errorMessage": null
},
...
]
}
- state – current step in the deposit pipeline (e.g.
Check Deposit Amount,Update Transfer Status - Complete); a state ending in Complete indicates the deposit has been credited - feeAmount / feeAssetCode / walletTransferId – populated once the deposit has been processed on-chain;
nullwhile still pending - tokenPriceUsd – USD reference price for the asset at the time of processing
- suspended –
trueif the workflow is paused awaiting manual review
Initiates a transfer of an asset either between two connected exchanges/venues, or from an exchange out to an external blockchain wallet address.
BLOCKCHAIN and supply the destination 'walletToAddress'.
Exchange to Exchange
{
"command": "CREATE",
"channel": "TRANSFER_WORKFLOW",
"signature": "valid signature",
"data": [
{
"class": "TransferWorkflow",
"fromExchange": "OPENTRADE",
"toExchange": "BITMART",
"cryptoAssetCode": "USDT",
"transferAmount": 4
}
]
}
Exchange to Blockchain Wallet (Withdrawal)
This is the same TRANSFER_WORKFLOW CREATE command used above — a withdrawal is simply a transfer where 'toExchange' is set to BLOCKCHAIN and 'walletToAddress' is the external destination address.
{
"command": "CREATE",
"channel": "TRANSFER_WORKFLOW",
"signature": "",
"data": [
{
"class": "TransferWorkflow",
"fromExchange": "OKEX",
"toExchange": "BLOCKCHAIN",
"walletToAddress": "0x1c93969dce56d7eeeb00679dcfe89d7e0f719979",
"cryptoAssetCode": "USDT",
"transferAmount": 15
}
]
}
ACTIVE_PROCESSES (in flight) or COMPLETED_PROCESSES (finished) to follow the withdrawal's progress. The response's 'txId' is populated once the withdrawal is broadcast on-chain.
Tracks the lifecycle of transfers created via the TRANSFER_WORKFLOW CREATE command, whether between exchanges or out to a blockchain wallet.
ACTIVE_PROCESSES or COMPLETED_PROCESSES. For COMPLETED_PROCESSES, 'removeFailed', 'date-from', 'date-to', 'page', 'pageSize', and 'transferSubType' are optional filters/pagination controls. 'transferSubType' accepts ALL or a more specific subtype to narrow results.
Active Processes
{
"command": "GET",
"signature": "valid signature",
"channel": "TRANSFER_WORKFLOW",
"channelArgs": [
{
"name": "category",
"value": "ACTIVE_PROCESSES"
}
]
}
Completed Processes
{
"command": "GET",
"signature": "valid signature",
"channel": "TRANSFER_WORKFLOW",
"channelArgs": [
{
"name": "category",
"value": "COMPLETED_PROCESSES"
},
{
"name": "removeFailed",
"value": "true"
},
{
"name": "date-from",
"value": "2026-07-01"
},
{
"name": "date-to",
"value": "2026-07-14"
},
{
"name": "page",
"value": "0"
},
{
"name": "pageSize",
"value": "500"
},
{
"name": "transferSubType",
"value": "ALL"
}
]
}
{
"channel": "TRANSFER_WORKFLOW",
"channelArgs": [ ... ],
"command": "GET",
"data": [
{
"class": "TransferWorkflow",
"fromExchange": "OPENTRADE",
"toExchange": "OKEX",
"cryptoAssetCode": "USDT",
"transferAmount": 5,
"walletTransferId": "ffa280b4-3c95-4741-bb25-d154193b6510",
"tag": null,
"processInstanceId": "b0d4b1a1-78ec-11f1-86a3-b6505867aca1",
"state": "Completed",
"message": null,
"startTime": "2026-07-06T03:42:19.954Z",
"endTime": "2026-07-15T18:36:19.707Z",
"suspended": false,
"walletFromAddress": "0x375b9d792d38105bee4b87f72941a6af071d9218",
"feeAmount": 0.00001031880686044,
"feeAssetCode": "ETH",
"txId": "0x205cce2e2077c709a2c9f2b8fffe8861b30c2421bce308bdc87e662d8f90edfb",
"exchangeTxId": null,
"exchangeTransferId": null,
"errorMessage": null,
"tasks": null
},
{
"class": "TransferWorkflow",
"fromExchange": "OKEX",
"toExchange": "OPENTRADE",
"cryptoAssetCode": "USDT",
"transferAmount": 5,
"walletTransferId": "916e31ee-700b-4e60-b6c2-9d14ad651fe9",
"tag": null,
"processInstanceId": "fe8858c3-78dd-11f1-86a3-b6505867aca1",
"state": "Completed",
"message": null,
"startTime": "2026-07-06T01:57:07.865Z",
"endTime": "2026-07-06T01:59:28.529Z",
"suspended": false,
"walletFromAddress": "OKEX",
"feeAmount": 0.097,
"feeAssetCode": "USDT",
"txId": null,
"exchangeTxId": "413425468",
"exchangeTransferId": "413425468",
"errorMessage": null,
"tasks": null
},
...
]
}
- walletFromAddress – the source wallet address for on-chain transfers, or the source exchange name for exchange-internal transfers
- txId – on-chain transaction hash, populated only for blockchain transfers;
nullfor exchange-to-exchange transfers - exchangeTxId / exchangeTransferId – venue-assigned transfer reference, populated only for exchange-to-exchange transfers
- state – reaches
Completedonce funds have arrived at the destination
Clients may request an RFQ stream for any symbol that is available on Open Trade.
{
"command": "SUBSCRIBE",
"channel": "RFQ POST",
"channelArgs": [
{
"name": "instrument",
"value": "[USD/ADA,ETH/BTC]"
}
],
"entries": [
{
"currency": "BTC",
"orderQuantity": 1,
"symbol": "BTC/USD"
}
],
"requestId": "test_001"
}
{
"command": "SUBSCRIBE",
"event": "ACK",
"channel": "RFQPOST"
}
{
"command": "SUBSCRIBE",
"event": "UPDATE",
"channel": "RFQPOST",
"data": [
{
"class": "OrderBook",
"exchange": "CROSSTOWER",
"symbol": "BTC/USD",
"bids": [
[19292.21]
],
"asks": [
[85100.0]
]
}
]
}
Order Types Reference
Order Types
- MARKET - Market order, executes immediately at best available price
- LIMIT - Limit order, executes at specified price or better
Order Sub-Types
- POST_ONLY - Only required if client wishes to submit a passive order which does not immediately fill. In case of immediate fill, order will be rejected.
Time In Force Options
- GTC (Good Till Cancelled) - Default option. Orders remain in the order book for up to 90 days
- GTD (Good Till Day) - Order will terminate at end of trading day (4:59 PM NY Time)
- GTT (Good Till Time) - Order remains alive until specific date/time (cannot exceed 90 days)
- FOK (Fill or Kill) - Order must be filled in full immediately or cancelled entirely
- IOC (Immediate or Cancel) - Order fills any available amount immediately and cancels the rest
Order Status Values
- NEW - Order has been accepted but not yet processed
- ACTIVE - Order is active in the order book
- PARTIALLY_FILLED - Order has been partially executed
- FILLED - Order has been completely executed
- CANCELLED - Order has been cancelled
- REJECTED - Order was rejected by the exchange
- EXPIRED - Order expired based on time in force settings
- COMPLETED - Order processing is complete
Request Types
- SMART - Default routing, automatically selects best exchange
- DIRECT - Routes directly to specified exchange (requires exchangeName parameter)
Important Notes
- Must be subscribed to a trading pair before placing orders on that pair
- clientOrderId must be unique - recommended to use Unix timestamp
- Price precision: up to 7 significant digits, 8 decimal places
- Amount precision: up to 8 decimal places
- Orders in the book for more than 90 days will be automatically cancelled