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
- 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
}
]
}
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 orders via CREATE action. Field orderId is mandatory and must be unique. Recommended way of generating the unique ID is using a timestamp in Unix format.
Order Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| action | String | Yes | Create, Cancel, Modify |
| amount | Number | Yes | Quantity of the order |
| clientId | String | Yes | Id of the account |
| clientOrderId | String | Yes | Id of the order (must be unique, recommend Unix timestamp) |
| exchangeName | String | Optional | Name of exchange to send order to |
| globalInstrumentCd | String | Yes | Pair (BTC/USD, ...) |
| orderSubType | String | Optional | POST_ONLY - for passive orders that don't immediately fill |
| orderType | String | Yes | MARKET or LIMIT |
| price | Number | Optional | Price (required for limit orders) |
| timeInForce | String | Optional | GTC, GTD, GTT, FOK, IOC |
| requestType | String | Optional | SMART (default) or DIRECT (Direct orders need exchangeName) |
| tradeSide | String | Yes | BUY or SELL (Note: also use "direction" field) |
Time In Force Options
- GTC - Good Till Cancelled (default, orders are in order book for 90 days)
- GTD - Good Till Day (will terminate at end of day 4:59PM NY TIME)
- GTT - Good Till Time (alive until specific date, cannot exceed 90 days)
- FOK - Fill or Kill (Fill full amount or nothing immediately)
- IOC - Immediate or Cancel (Fill any amount and cancel the rest immediately)
{
"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 orderId or exchangeOrderId if orderId is not known. Only one parameter is needed and will be accepted.
Cancel Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| action | String | Yes | Cancel |
| globalInstrumentCd | String | No | Pair [BTC/USD, ...] |
| orderId | String | No | clientOrdId |
| exchangeOrderId | String | No | exchangeOrderId |
{
"command": "CANCEL",
"signature": "valid signature",
"channel": "TRADE_PRIVATE",
"data": [
{
"class": "Order",
"globalInstrumentCd": "BTC/USD",
"orderId": "7777"
// OR use exchangeOrderId instead:
// "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
},
...
]
}
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