Private API

Private Channels Overview

Private channels provide access to account-specific data and trading operations. All private channels require authentication via a valid JWT token.

Authentication Required All private channels require a valid signature token. Ensure you have completed the authentication flow before attempting to access these channels.
Available Private Channels
  • BALANCE - Real-time account balance updates
  • TRADE_PRIVATE - Private trades and order management
  • TRADE_POSITIONS - Current trading positions
  • RFQ POST - Request for Quote functionality
Balance

Real-time balance updates for specified currencies. Provides both snapshot and incremental updates.

Subscribe Request
{
    "command": "SUBSCRIBE",
    "signature": "valid_signature",
    "channel": "BALANCE",
    "channelArgs": [
        {
            "name": "currency",
            "value": "[USD,ADA,ETH,BTC]"
        }
    ]
}
Acknowledgment
{
    "command": "SUBSCRIBE",
    "event": "ACK",
    "channel": "BALANCE"
}
Snapshot Response
{
    "command": "SUBSCRIBE",
    "event": "SNAPSHOT",
    "channel": "BALANCE",
    "data": [
        {
            "class": "Balance",
            "currencyCode": "ADA",
            "balance": 16140.3555,
            "available": 16040.3555,
            "locked": 100.0
        }
    ]
}
Update Response
{
    "command": "SUBSCRIBE",
    "event": "UPDATE",
    "channel": "BALANCE",
    "data": [
        {
            "class": "Balance",
            "currencyCode": "ADA",
            "balance": 16140.3555,
            "available": 16040.3555,
            "locked": 100.0
        }
    ]
}
Private Trades

Private trades subscription will provide a snapshot of currently open ACTIVE orders and then updates via WebSocket.

Important! Must be subscribed to valid pairs in order to get WS updates for those pairs! May subscribe to multiple pairs if desired.
Subscribe Request
{
    "command": "SUBSCRIBE",
    "signature": "valid signature",
    "channel": "TRADE_PRIVATE",
    "channelArgs": [
        {
            "name": "instrument",
            "value": "[BTC/USD,ETH/BTC]"
        }
    ]
}
Current Active Orders Response
{
    "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
        }
    ]
}
Real-time Order Update
{
    "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 Get Active Private Trades

Get current list of open orders. One time request/response.

Note: Either channel argument 'instrument' or the 'data' section must be provided. If both are present, the server will return no data.
Request
{
    "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]"
        }
    ]
}
Alternative Request (using data section)
{
    "command": "GET",
    "signature": "valid signature",
    "channel": "TRADE_PRIVATE",
    "channelArgs": [
        {
            "name": "category",
            "value": "ACTIVE_ORDERS"
        }
    ],
    "data": [
        {
            "class": "Order",
            "globalInstrumentCd": "BTC/USD",
            "clientOrderId": "123456789",
            "exchangeOrderId": "5464564"
        }
    ]
}
CREATE Send New Order

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.

Critical! Before sending the new order, user must first be subscribed to desired pair, otherwise order will be rejected!!

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)
LIMIT Order Request
{
    "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"
        }
    ]
}
ACK Response
{
    "command": "CREATE",
    "event": "ACK",
    "channel": "TRADE_PRIVATE"
}
Accepted Response
{
    "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"
        }
    ]
}
Rejection Response
{
    "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"
        }
    ]
}
Filled Order Response
{
    "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"
        }
    ]
}
CANCEL Cancel Order

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.

Note: If no orderId or exchangeOrderId are added in the message, all orders for selected pair/s will be cancelled.
Important! Must be subscribed to valid pair in order to cancel order in proper pair!

Cancel Parameters

Field Type Required Description
action String Yes Cancel
globalInstrumentCd String No Pair [BTC/USD, ...]
orderId String No clientOrdId
exchangeOrderId String No exchangeOrderId
Cancel Request (using orderId)
{
    "command": "CANCEL",
    "signature": "valid signature",
    "channel": "TRADE_PRIVATE",
    "data": [
        {
            "class": "Order",
            "globalInstrumentCd": "BTC/USD",
            "orderId": "7777"
            // OR use exchangeOrderId instead:
            // "exchangeOrderId": "1668553243505"
        }
    ]
}
ACK Response
{
    "command": "CANCEL_REQUEST",
    "event": "ACK",
    "channel": "TRADE_PRIVATE"
}
Success Response
{
    "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"
        }
    ]
}
MODIFY Modify Order

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
Modify Request
{
    "command": "MODIFY",
    "signature": "valid signature",
    "channel": "TRADE_PRIVATE",
    "data": [
        {
            "class": "Order",
            "globalInstrumentCd": "BTC/USD",
            "orderId": "7777",
            "price": "0.215",
            "amount": "0.215"
        }
    ]
}
GET Private Trades History

Clients may request a list of PARTIALLY_FILLED, FILLED trades for a required time frame.

Note: Channel arguments 'date-from', 'date-to' are optional. If 'date-from' is not provided, it will be defaulted to 'now minus 24 hours'. If 'date-to' is not provided, it will be defaulted to 'now'.
Request
{
    "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"
        }
    ]
}
Response
{
    "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
        },
        ...
    ]
}
GET Private Orders History

Clients may request a list of COMPLETED, REJECTED, PARTIALLY_FILLED, FILLED, EXPIRED order requests for a required time frame.

Note: Channel arguments 'date-from', 'date-to', 'status' are optional. If 'date-from' is not provided, it will be defaulted to 'now minus 24 hours'. If 'date-to' is not provided, it will be defaulted to 'now'. If 'status' is not provided then trades with any status will be selected.
Request
{
    "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 Trade Positions

Get current trade positions with entry prices, volumes, and stop loss/take profit levels.

Request
{
    "command": "GET",
    "signature": "valid signature",
    "channel": "TRADE_POSITIONS"
}
Response
{
    "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
        },
        ...
    ]
}
Request for Quote (RFQ)

Clients may request an RFQ stream for any symbol that is available on Open Trade.

Subscribe Request
{
    "command": "SUBSCRIBE",
    "channel": "RFQ POST",
    "channelArgs": [
        {
            "name": "instrument",
            "value": "[USD/ADA,ETH/BTC]"
        }
    ],
    "entries": [
        {
            "currency": "BTC",
            "orderQuantity": 1,
            "symbol": "BTC/USD"
        }
    ],
    "requestId": "test_001"
}
Acknowledgment
{
    "command": "SUBSCRIBE",
    "event": "ACK",
    "channel": "RFQPOST"
}
Data Response
{
    "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

Available Time In Force Values
  • 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

Possible Order Status
  • 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

Critical Requirements
  • 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