FIX API
Introduction
FIX is a proven, reliable protocol for market participants to exchange orders, stream market data, manage settlement, and more.
For more on the FIX protocol, see the FPL website: http://www.fixprotocol.org
Axon Trade uses a slightly modified FIX 4.4 specification to support both market data streaming and trading. Ready-to-use dictionaries for popular FIX engines:
Axon Trade provides two session types — trading and market data — each with its own message set. Both sessions require authentication and may enforce SSL depending on your configuration.
Code samples for several FIX engines and programming languages are available in our demo repository.
Maintenance
To deliver ongoing improvements and security patches, Axon Trade reserves a 10-minute daily maintenance window per datacenter. During this window, both market data and trading sessions may be unavailable.
Maintenance schedule by location:
| Datacenter | Start Time | End Time |
|---|---|---|
| LD4 | 02:00 UTC | 02:10 UTC |
| EWR2 | 08:00 UTC | 08:10 UTC |
| TY8 | 01:00 UTC | 01:10 UTC |
Market Data Session
The Market Data session delivers order book updates from Axon Trade servers to the client.
To minimize bandwidth, updates are sent as incremental changes rather than full book refreshes. The correct workflow is to receive an initial book snapshot, then apply each incoming change:
- NEW — add a new price level
- UPDATE — update the size at an existing price level
- DELETE — remove a price level
Workflow
Messages Structure
The Feed server uses a slightly modified FIX 4.4 specification (see Market Data Incremental Refresh).
Header
Example:
Field Name
Example
BeginString
8=FIX4.4
BodyLength
9=502
MsgType
35=A
SenderCompID
49=COMPANY_NAME
TargetCompID
56=AXON-MD-NY4-1
MsgSeqNum
34=1000123
SendingTime
52=2018-08-02T03:30:30.658
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 8 | BeginString | Y | Identifies the beginning of the message and represents the Transmission Protocol version. Supported values:
|
| 9 | BodyLength | Y | Message length (number of bytes) forward to the CheckSum tag. |
| 35 | MsgType | Y | Defines message type e.g. Logon(A) |
| 49 | SenderCompID | Y | Assigned value used to identify sender of a message |
| 56 | TargetCompID | Y | Assigned value used to identify receiving firm Supported values:
|
| 34 | MsgSeqNum | Y | Integer message sequence number |
| 52 | SendingTime | Y | Time of message transmission (always expressed in UTC (Universal Time Coordinated, also known as "GMT")) |
Footer
Example:
Field Name
Example
CheckSum
10=250
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 10 | CheckSum | Y | Three bytes, simple checksum |
Messages
Logon
Example:
Field Name
Example
EncryptMethod
89=0
HeartBtInt
108=5
ResetSeqNumFlag
141=Y
Username
553=account_1
Password
554=StR0nG_P
MsgType: A
Direction: IN/OUT
Description: The first message sent to establish a FIX session. On success, the server responds with its own Logon message.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 98 | EncryptMethod | Y | Supported Values:
|
| 108 | HeartBtInt | Y | 108=5 |
| 141 | ResetSeqNumFlag | N | Indicates both sides of a FIX session should reset sequence numbers |
| 553 | Username | Y | Session Username Required for Outgoing message |
| 554 | Password | Y | Session Password Required for Outgoing message |
Logout
Example:
Field Name
Example
Text
58=Incorrect Username or Password
MsgType: 5
Direction: IN/OUT
Description: Sent to cleanly terminate the session. The server echoes back a Logout to confirm disconnection.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 58 | Text | N | Disconnection reason in human-readable format Please note, that this field might be absent |
SecurityListRequest
Example:
FieldName
Example
SecurityReqID
320=REQ_1
SecurityListRequestType
559=0
SecurityExchange
207=HUOBI
MsgType: x
Direction: OUT
Description: Retrieves the list of all tradable instruments available on a specified exchange.
| Tag | FieldName | Required | Comments |
|---|---|---|---|
| 320 | SecurityReqID | Y | Unique request ID |
| 559 | SecurityListRequestType | Y | Type of request being performed by a counterparty. Supported values:
|
| 207 | SecurityExchange | Y | Exchange name to extract a list of all instruments |
SecurityList
Example:
FieldName
Example
SecurityReqID
320=REQ_1
SecurityResponseID
SecurityRequestResult
560=0
TotNoRelatedSym
393=51
LastFragment
893=false
Text
58=Exchange ABC not found
NoRelatedSym
146=1
Symbol
55=ETH/BTC
SecurityExchange
207=HUOBI
Price Precision
5001=8
Size Precision
5002=4
MsgType: y
Direction: IN
Description: Returns securities matching the criteria from SecurityListRequest. Because lists can be large, each instrument is delivered in a separate SecurityList message. Use TotNoRelatedSym (393) and LastFragment (893) to detect the end of a transmission.
| Tag | FieldName | Required | Comments | |
|---|---|---|---|---|
| 320 | SecurityReqID | Y | ID from the initiating SecurityListRequest | |
| 322 | SecurityResponseID | Y | ||
| 560 | SecurityRequestResult | Y | Supported Values:
|
|
| 393 | TotNoRelatedSym | N | This field contains information about a number of instruments that matched initial search criteria. |
|
| 893 | LastFragment | N | Boolean field that indicates whether this is the last message in the transmission | |
| 58 | Text | C | Optional field that will hold human-readable information about the error (if one occurred) | |
| 146 | NoRelatedSym | C | In case of successful request - always 1 | |
| ↦ | 55 | Symbol | C | |
| ↦ | 207 | SecurityExchange | C | |
| ↦ | 5001 | Price Precision | C | Integer value that represents a number of decimal points in prices for given Symbol/Exchange |
| ↦ | 5002 | Size Precision | C | Integer value that represents a number of decimal points in size for given Symbol/Exchange |
| ↦ | 562 | MinTradeVol | C | The minimum trading volume for a security |
| ↦ | 711 | NoUnderlyings | C | This group provides additional information about the underlying assets or contracts that constitute a composite or derivative trading security. In case of successful request - always 2 |
| ↦↦ | 311 | UnderlyingSymbol | C | |
| ↦↦ | 463 | UnderlyingCFICode | C |
Underlying security's CFICode.
|
| ↦↦ | 5002 | Size precision | C | |
MarketDataRequest
Example:
Field Name
Example
MDReqID
262=1001_1
SubscriptionRequestType
263=1
MarketDepth
264=0
MDUpdateType
265=1
NoMDEntryTypes
267=1
MDEntryType
269=0
NoRelatedSym
141=1
Symbol
55=ETH/BTC
SecurityExchange
207=HUOBI
MsgType: V
Direction: OUT
Description: Subscribes to real-time market data for one or more symbols on one or more exchanges. On success, the server sends a book snapshot followed by incremental updates.
You can subscribe to multiple symbols across multiple exchanges in a single message. Note that subscription requests are all-or-nothing — if any instrument in the request is invalid, the entire message is rejected.
To unsubscribe, send a MarketDataRequest with SubscriptionRequestType=Disable (2), with all required fields populated and the NoRelatedSym (146) group containing a single Symbol (55) entry with the value “ALL”.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 262 | MDReqID | Y | Unique ID | |
| 263 | SubscriptionRequestType | Y | Supported Values:
|
|
| 264 | MarketDepth | Y | The field used to specify the number of bids/asks to receive. Supported Values:
|
|
| 265 | MDUpdateType | Y | Supported values:
|
|
| 267 | NoMDEntryTypes | Y | You can choose one or several values | |
| ↦ | 269 | MDEntryType | Y | Supported Values:
|
| 146 | NoRelatedSym | Y | It is possible to subscribe to several symbols using a single MarketDataRequest message |
|
| ↦ | 55 | Symbol | Y | Symbol name |
| ↦ | 207 | SecurityExchange | Y | Name of the exchange to receive market data |
MarketDataRequestReject
Example:
Field Name
Example
MDReqID
262=100_112
MDReqRejReason
281=0
Text
58=ABC/TEST
MsgType: Y
Direction: IN
Description: Sent when a MarketDataRequest cannot be processed. If the request contained multiple invalid instruments, the server sends a single reject describing the first error encountered.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 262 | MDReqID | Y | Unique MDReqID provided in the MarketDataRequest message that has failed. |
| 281 | MDReqRejReason | Y |
|
| 58 | Text | Y | Error description in a human-readable format |
MarketDataSnapshotFullRefresh
Example:
Field Name
Example
MDReqID
262=100_1
Symbol
55=ETH/BTC
SecurityExchange
207=HUOBI
RptSeq
83=2685
NoMDEntries
268=1
MDEntryType
269=0
MDEntryPx
270=0.035089
MDEntrySize
271=3.014
MDEntryDate
272=20180601
MDEntryTime
273=03:30:30.657
MsgType: W
Direction: IN
Description: Contains the full order book snapshot for the specified instrument. The depth is controlled by the MarketDepth parameter in the MarketDataRequest.
When using MDUpdateType=FullRefresh (0), the server may send a book reset — a specially formatted snapshot with two NoMDEntries records (one BID, one OFFER) where both MDEntryPx and MDEntrySize are 0. On receiving this, invalidate all price levels on your side. There is no need to re-subscribe — the server will automatically resume streaming once conditions on the counterparty's side have changed.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 262 | MDReqID | Y | MDReqID associated with the previous request | |
| 55 | Symbol | Y | Symbol name | |
| 207 | SecurityExchange | Y | Exchange name | |
| 83 | RptSeq | Y | Sequence number of events | |
| 268 | NoMDEntries | Y | ||
| ↦ | 269 | MDEntryType | Y | Supported Values:
|
| ↦ | 270 | MDEntryPx | Y | Price |
| ↦ | 271 | MDEntrySize | Y | Entry size |
| ↦ | 299 | QuoteEntryID | С | Conditional field used when Bid or Offer represents a quote |
| ↦ | 272 | MDEntryDate | Y | Date when the given entry has been added or modified last time ISO 8601 format is used, UTC timezone |
| ↦ | 273 | MDEntryTime | Y | Time when the given entry has been added or modified, UTC timezone |
MarketDataIncrementalRefresh
Example:
Field Name
Example
MDReqID
262=100_1
Symbol
55=ETH/BTC
SecurityExchange
207=HUOBI
NoMDEntries
268=1
MDUpdateAction
279=1
MDEntryType
269=0
MDEntryPx
270=0.035089
MDEntrySize
271=3.214
MDEntryDate
272=20180601
MDEntryTime
273=03:30:32.506
AggressorSide
2446=0
RptSeq
83=587
MsgType: X
Direction: IN
Description: Carries incremental order book updates. A single message may contain any number of NEW, UPDATE, DELETE, or TRADE events. Apply them in this order: DELETE → UPDATE → NEW. The server always sends explicit DELETE events — never assume a level is implicitly removed.
Note: Axon Trade’s MarketDataIncrementalRefresh deviates from standard FIX 4.4 by moving Symbol (55) and SecurityExchange (207) out of the NoMDEntries (268) group to the message level.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 262 | MDReqID | Y | MDReqID associated with the previous request | |
| 55 | Symbol | Y | Symbol Name | |
| 207 | SecurityExchange | Y | Exchange Name | |
| 268 | NoMDEntries | Y | ||
| ↦ | 279 | MDUpdateAction | Y | Supported Values:
|
| ↦ | 269 | MDEntryType | Y | Supported Values:
|
| ↦ | 270 | MDEntryPx | Y | Price |
| ↦ | 271 | MDEntrySize | N | Entry size. This field might be absent in case of DELETE event |
| ↦ | 272 | MDEntryDate | Y | Date when the given entry has been added or modified last time ISO 8601 format is used, UTC timezone |
| ↦ | 273 | MDEntryTime | Y | Time when the given entry has been added or modified, UTC timezone |
| ↦ | 2446 | AggressorSide | N | Indicates which side is the aggressor of the trade (MDEntryType = TRADE). Supported Values:
|
| ↦ | 83 | RptSeq | Y | MD Entry sequence number per instrument update |
Trading Session
A trading session is used to send orders to liquidity providers and receive confirmations.
FIX is a two-way, asynchronous communication channel — no polling required. Any change to an order's status is pushed to you automatically.
By default, a single trading session acts as the entry point for all of your organization's accounts and exchanges, minimizing integration complexity. For more advanced routing needs, embedded ACL rules let you control which logins can send to which destinations.
Organizational structure
| Organization | The top-level entity representing your company within Axon Trade. |
| Account | Holds links to exchanges. An Organization can have multiple Accounts. |
| Login | Used to authenticate and submit trading operations. |
Order states diagram

When the server receives an order, it responds with an ExecutionReport containing one of two initial statuses (OrdStatus field):
- PENDING NEW – the order has been accepted for processing
- REJECTED – the order failed initial validation
From PENDING NEW, the order can transition to: - NEW – the order was accepted by the target exchange - from here you may receive PARTIALLY FILLED or FILLED reports, or CANCELED (either via an Order Cancel Request or a TimeInForce expiry) - CANCELED – the order was rejected by the exchange
Dictionaries
Security Type
| Type | Value | Description |
|---|---|---|
| Foreign Exchange Contract | FOR | All fiat to fiat pairs |
| Digital Assets Spot Contract | CRYPTOSPOT | All crypto to crypto or crypto to fiat spot contracts |
| Perpetual Swap Contract | PERPSWAP | Perpetual swap contracts such as BTC-PERPETUAL |
| Futures Contracts | FUT | Futures contracts |
Order Types
| Order Type | Comments |
|---|---|
| Market(1) | When sending market orders, Price or StopPx is not required to be set |
| Limit(2) | When sending limit orders, Price(44) field is required to be set |
Order Sides
Only 2 sides are supported:
- Buy(1)
- Sell(2)
Time in Force
| Type | Comments |
|---|---|
| Day(0) | If order becomes pending, it will be canceled at the end of the trading session |
| Good Till Cancel(1) | |
| Immediate Or Cancel(3) | Limit order will be executed at an exact price or better immediately, else will be canceled |
| Fill Or Kill(4) | Order will be filled for the quantity specified in OrderQt, else will be canceled |
Messages
Logon
MsgType: A
Direction: IN/OUT
Description: The first message sent to establish a FIX session. On success, the server responds with its own Logon message.
| Tag | Field Name | Required | Comments | Example |
|---|---|---|---|---|
| 98 | EncryptMethod | Y | Always set to None(0) | 98=0 |
| 108 | HeartBtInt | Y | Heartbeat interval, always 30s | 108=30 |
| 553 | Username | Y | 553=1001 | |
| 554 | Password | Y | 554=Rr68twd6mw |
Logout
MsgType: 5
Direction: IN/OUT
Description: Sent to cleanly terminate the session. The server echoes back a Logout to confirm disconnection.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 58 | Text | N | Disconnection reason in human-readable format Please note, that this field might be absent |
NewOrderSingle
Example:
Field Name
Example
Account
1=1001
ClOrdID
11=1234
12=ORD_1234
OrderQty
39=0.125
OrdType
40=1
Price
44=0.033528
StopPx
99=0.033612
Side
54=1
Symbol
55=ETH/BTC
TimeInForce
59=0
TransactionTime
60=20180912-12:05:15.105
ExDestination
100=OKEX
SecurityType
167=FOR
ExecInst
18=6
MsgType: D
Direction: OUT
Description: Used to submit a new order to the specified exchange.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 1 | Account | Y | Login ID, associated with given session |
| 11 | ClOrdID | Y | Client assigned order ID Maximum length - 50 characters |
| 38 | OrderQty | Y | Initial Order size |
| 40 | OrdType | Y | Type of order Supported values:
|
| 44 | Price | C | Conditional field, indicating an expected fill price. Required for:
|
| 99 | StopPx | C | Conditional field, required for Stop order type |
| 54 | Side | Y | Order side used Supported Values:
|
| 55 | Symbol | Y | Symbol name |
| 59 | TimeInForce | Y | Control orders lifetime behavior. Supported Values:
|
| 60 | TransactionTime | Y | Timestamp in UTC timezone when the order was created with included milliseconds |
| 100 | ExDestination | Y | ECN or Venue name where the order will be sent/executed |
| 167 | SecurityType | Y | Type of security to trade. Supported values:
|
| 18 | ExecInst | N | Instructions for orders handling during execution. Supported values:
|
| 117 | QuoteID | C | Required for Previously Quoted Orders (OrdType <40>=D) |
Order Cancel Request
Example:
Field Name
Example
Account
1=1001
ClOrdID
11=1234
OrderID
37=312351044
OrigClOrdID
41=1233
Side
51=1
Symbol
55=ETH/USD
TransactionTime
60=20180912-12:05:15.105
MsgType: F
Direction: OUT
Description: Cancels an order in its entirety. Only orders in NEW or PARTIALLY FILLED status can be canceled. To reduce the unfilled quantity without canceling the whole order, use Order Cancel/Replace Request instead.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 1 | Account | Y | Trader ID that owns order that has to be canceled |
| 11 | ClOrdID | Y |
Client order ID for cancel operation Maximum length - 50 characters |
| 37 | OrderID | Y | OrderID which should be canceled |
| 41 | OrigClOrdID | Y |
Client order ID of order which should be canceled Maximum length - 50 characters |
| 54 | Side | Y | Order side of order, identified by OrigClOrdID/OrderID |
| 55 | Symbol | Y | Symbol, association with working order |
| 60 | TransactionTime | Y | Timestamp in UTC timezone when the order was created, including milliseconds |
Order Cancel/Replace Request
Example:
Field Name
Example
Account
1=1001
ClOrdID
11=1234
OrderID
37=312351044
OrigClOrdID
41=1233
Side
51=1
Symbol
55=ETH/USD
Price
44=1400.50
OrderQty
38=1.12
TransactionTime
60=20180912-12:05:15.105
MsgType: G
Direction: OUT
Description: Modifies a previously placed order. Only orders in NEW or PARTIALLY FILLED status can be modified. You can change the price, the size, or both. Increasing the size raises LeavesQty; decreasing it reduces LeavesQty.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 1 | Account | Y | Trader ID that owns the order being modified |
| 11 | ClOrdID | Y | Client-assigned ID for replacement operation Maximum length - 50 characters |
| 37 | OrderID | Y | ID of the order being modified |
| 41 | OrigClOrdID | Y | Client order ID of the order being modified Maximum length - 50 characters |
| 54 | Side | Y | Order side of order, identified by OrigClOrdID/OrderID |
| 55 | Symbol | Y | Symbol, association with working order |
| 44 | Price | N | New price for the order |
| 38 | OrderQty | Y |
New size for the order. OrderQty has to be submitted even if only Price has to be changed. |
| 60 | TransactionTime | Y | Timestamp in UTC timezone when the order was created, including milliseconds |
Order Cancel/Reject
Example:
Field Name
Example
Account
1=1001
ClOrdID
11=CCL_001
OrigClOrdID
41=TRD_00231
OrderID
37=1123423
CxlRejReason
102=0
CxlRejResponseTo
434=1
Text
58=Can't cancel filled order
TransactionTime
60=20180912-12:15:15.105
MsgType: F
Direction: IN
Description: Sent by the server when an Order Cancel Request or Order Cancel/Replace Request could not be processed.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 1 | Account | Y | |
| 11 | ClOrdID | C | ID of client order which was used to perform cancel operation Maximum length - 50 characters |
| 41 | OrigClOrdID | C | ID of canceling client order Maximum length - 50 characters |
| 37 | OrderID | C | ID of working order on Axon Trade side. Usually transmitted as OrderID within ExecutionReport message |
| 102 | CxlRejReason | Y | Supported Values:
|
| 434 | CxlRejResponseTo | Y | Supported Values:
|
| 58 | Text | C | Textual comments about rejection reason |
| 60 | TransactionTime | Y | Timestamp in UTC timezone when the Order cancel was rejected |
ExecutionReport
Example:
Field Name
Example
Account
1=1001
ClOrdID
11=1234
12=ORD_1234
OrderID
37=312351043
SecondaryOrderID
198=ea4063b0-4b66-11ea-b77f2e728ce88125
ExecID
17=4000123541
MassStatusReqId
584=ord_req_1223
TotNumReports
911=14
LastRptRequested
913=Y
OrdType
40=1
Price
44=0.033953
Side
54=1
Symbol
55=ETH/BTC
OrdStatus
39=2
ExecType
150=F
AvgPx
6=0.033959
LastPx
31=0.033951
LastQty
32=0.100
CumQty
14=0.200
LeavesQty
151=0.300
Text
58=Account not found.
TimeInForce
59=0
TransactionTime
60=20180912-12:05:15.105
ExDestination
100=OKEX
OrdRejReason
103=11
SecurityType
167=CRYPTOSPOT
Commission
12=0.001
CommisionType
13=3
CommissionCurrency
479=USD
ExecInst
18=6
MsgType: 8
Direction: IN
Description: Reports order status updates — confirmations, fills, cancellations, and unsolicited state changes.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 1 | Account | Y | Login ID, associated with a given session |
| 11 | ClOrdID | Y | Client-assigned order ID |
| 37 | OrderID | Y | Order ID on Axon Trade side |
| 198 | SecondaryOrderID | C | Order ID, assigned by target exchange |
| 17 | ExecID | Y | Order execution ID This field will be set to zero("0") when processing MassOrderStatusRequest message (ExecType=ORDER STATUS(I)) |
| 584 | MassStatusReqId | N | Request ID, associated with MassOrderStatusRequest message |
| 911 | TotNumReports | N | A conditional field that will appear in the response to Order Mass Status Request(AF) message. Contains a total number of all orders that meet search criteria |
| 912 | LastRptRequested | N | A conditional field that appears only for reports with ExecType=ORDER STATUS. Indicates that this is the very last message in the batch |
| 40 | OrdType | Y | Type of order Supported values:
|
| 44 | Price | Y | Conditional field, indicating expected fill price for Limit orders |
| 54 | Side | Y | Order side used Supported Values:
|
| 55 | Symbol | Y | Symbol name |
| 39 | OrdStatus | Y | Reports current order status Supported values:
|
| 150 | ExecType | Y | Reports current execution status: Supported values:
|
| 6 | AvgPx | Y | Average price of all executed parts(in case of partial fills) |
| 31 | LastPx | C | Price of last executed part. If order fully filled at once, LastPx will be same as AvgPx |
| 32 | LastQty | C | Last executed size. |
| 14 | CumQty | Y | Total executed quantity for a given order (sum of all fills) |
| 151 | LeavesQty | Y | Indicates quantity of order still not-executed yet live. |
| 58 | Text | C | May contain optional text information related to order status. E.g. textual explanation of rejection |
| 59 | TimeInForce | Y | Control order lifetime behavior. Supported Values:
|
| 60 | TransactionTime | Y | Time of the most recent Order's update,timestamp in UTC timezone. |
| 100 | ExDestination | Y | ECN or Venue name where the order was sent/executed |
| 103 | OrdRejReason | C | In case of a rejection, this field will help identify the source of error
|
| 167 | SecurityType | Y | Type of security. Supported values:
|
| 12 | Commission | C | Commission charged for the last execution or for the entire chain of executions(as a response for OrderMassStatusRequest). Only orders in status PARTIALLY_FILLED(1) or FILLED(2) have this tag set. |
| 13 | CommisionType | C | Supported values:
|
| 479 | CommissionCurrency | C | Currency used to charge given commission Only orders in status PARTIALLY_FILLED(1) or FILLED(2) have this tag set. |
| 18 | ExecInst | N | Instructions for orders handling during execution. Supported values:
|
OrderMassStatusRequest
Example:
Field Name
Example
MassStatusReqId
584=request_123
MassStatusReqType
585=1
NoPartyIDs
453=1
PartyID
448=HUOBI
PartyRole
452=22
MsgType: AF
Direction: OUT
Description: Requests a list of open orders matching the specified criteria. The server responds with a series of ExecutionReports (ExecType=ORDER STATUS), each echoing the MassStatusReqId (584) from the request.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 584 | MassStatusReqId | Y | Unique ID, associated with a given request | |
| 585 | MassStatusReqType | Y | Specify the scope of a mass status request. Supported Values:
|
|
| 453 | NoPartyIDs | C | Mandatory, when MassStatusReqType=8 and holds a list of actual trading Logins. Additionally, can be used to narrow request scope by specifying exchanges. If no exchange-related information is provided, the server will respond with a list that includes open orders from all exchanges. |
|
| ↦ | 448 | PartyID | Exchange name Login ID |
|
| ↦ | 452 | PartyRole | Supported values:
|
|
RequestForPositions
Example:
Field Name
Example
PosReqId
710=req_1
PosReqType
724=0
SubscriptionRequestType
263=1
Account
1=1001
AccountType
581=1
ClearingBusinessDay
715=20191107
NoPartyIDs
453=1
PartyID
HUOBI
PartyRole
452=22
TransactTime
60=20191107-12:05:15.105
MsgType: AN
Direction: OUT
Description: Requests position data for a given exchange and login. You can request a one-time snapshot, or subscribe to incremental updates delivered whenever a position changes.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 710 | PosReqId | Y | Unique ID, associated with a given request | |
| 724 | PosReqType | Y | Used to narrow the scope of information transmitted. Supported values:
|
|
| 263 | SubscriptionRequestType | Y | Used to subscribe or unsubscribe from reports. Supported values:
|
|
| 1 | Account | Y | Organization ID | |
| 581 | AccountType | Y | Type of account associated with a position request Supported values:
|
|
| 715 | ClearingBusinessDay | Y | The Clearing Business Date referred to by this request | |
| 453 | NoPartyIDs | Y | ||
| ↦ | 448 | PartyID | Y | Counterparty name e.g. name of the target exchange Login ID |
| ↦ | 452 | PartyRole | Y | Supported values:
|
| 60 | TransactTime | Y | Time, when this request was initiated | |
Examples
Your Organization ID is 1001 and it manages four trading accounts – 1234, 2000, 2101, 4442.
You want to get a snapshot of all positions your organization has under management. In this case, the NoPartyIDs group will look as follows:
| Entry # | Tag | Name | Value |
|---|---|---|---|
| 0 | 448 | PartyID | 1001 |
| 0 | 452 | PartyRole | 6 |
This request (if executed successfully) should return positions for logins 1234, 2000, 2101, and 4442.
If you are looking for positions that belong to certain logins (e.g. 1234 and 4442) then the NoPartyIDs group will be as follows:
| Entry # | Tag | Name | Value |
|---|---|---|---|
| 0 | 448 | PartyID | 1234 |
| 0 | 452 | PartyRole | 11 |
| 1 | 448 | PartyID | 4442 |
| 1 | 452 | PartyRole | 11 |
RequestForPositionsAck
Example:
Field Name
Example
PosMaintRptId
721=123456021
PosReqId
710=req_1
TotalNumPosReports
727=246
PosReqResult
728=0
PosReqStatus
729=0
NoPartyIDs
453=2
PartyID
448=AXON
PartyRole
452=11
Account
1=1001
AccountType
581=1
SecurityExchange
207=OKEX
Text
58=Not authorized to request positions for given Account
MsgType: AO
Direction: IN
Description: Acknowledges a RequestForPositions. Includes the request status and the total number of position reports that will follow in the snapshot.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 721 | PosMaintRptId | Y | Unique identifier for this position report | |
| 710 | PosReqId | N | Request ID, copied from the parent message | |
| 727 | TotalNumPosReports | N | Number of positions returned | |
| 728 | PosReqResult | Y | Indicates the request status. Supported values:
|
|
| 729 | PosReqStatus | Y | Status of request for positions. Supported values:
|
|
| 453 | NoPartyIDs | Y | ||
| ↦ | 448 | PartyID | ||
| ↦ | 452 | PartyRole | Supported values:
|
|
| 1 | Account | Y | Organization ID | |
| 581 | AccountType | Y | Type of account associated with a position request Supported values:
|
|
| 207 | SecurityExchange | N | Name of the trading venue to get a list of the positions | |
| 58 | Text | N | Human-readable error message | |
PositionReport
Example:
Field Name
Example
PosMaintRptID
721=1002312
PosReqID
710=req_12
PosReqResult
728=0
ClearingBusinessDate
715=20191107
NoPartyIDs
453=2
PartyID
448=12
PartyRole
1=1001
Account
1=2342
AccountType
581=1
Symbol
55=ETH
SecurityType
167=FUT
NoPositions
702=1
PosType
703=ETR
LongQty
703=500.123000
MsgType: AP
Direction: IN
Description: Contains balance and position data for a single asset. Delivered as part of a snapshot in response to RequestForPositions, or as an unsolicited update when a position changes.
| Tag | Field Name | Required | Comments | |
|---|---|---|---|---|
| 721 | PosMaintRptID | Y | Unique identifier for this position report | |
| 710 | PosReqID | N | This field will be set when returning positions snapshot and will be omitted for any sequential updates |
|
| 728 | PosReqResult | Y | Always 0(Valid Request) | |
| 715 | ClearingBusinessDate | Y | Always today | |
| 453 | NoPartyIDs | Y | For a regular report, NoParties group contains 2 entries:
|
|
| ↦ | 448 | PartyID | ||
| ↦ | 452 | PartyRole | N | Supported values:
|
| 1 | Account | Y | Organization ID | |
| 581 | AccountType | Y | Type of account associated with a position request Supported values:
|
|
| 55 | Symbol | Y | Human readable asset name | |
| 167 | SecurityType | Y | Supported values:
|
|
| 702 | NoPositions | Y | ||
| ↦ | 703 | PosType | Supported Values:
|
|
| ↦ | 704 | LongQty | Either LongQty or ShortQty is available as part of this group. ShortQty is not available for SPOT markets. |
|
| ↦ | 705 | ShortQty | ||
TradingSessionStatusRequest
Example:
Field Name
Example
TradSesReqID
335=session_request_1
SubscriptionRequestType
263=1
MsgType: g
Direction: OUT
Description: Requests the current connectivity status for all outgoing exchange connections and subscribes to future status changes. The server responds with one or more TradingSessionStatus messages.
|
Tag
|
Field Name
|
Required
|
Comments
|
|---|---|---|---|
| 335 | TradSesReqID | Y | Unique ID associated with the given request |
| 263 | SubscriptionRequestType | Y |
Supported Values:
|
TradingSessionStatus
Example:
Field Name
Example
TradSesReqID
335=session_request_1
TradingSessionID
336=DERIBIT
TradingSessionSubId
625=1
UnsolicitedIndicator
325=Y
TradSesStatus
340=2
Text
58=AUTH ERROR
MsgType: h
Direction: IN
Description: Sent by the server in two scenarios: as a snapshot in response to a TradingSessionStatusRequest, or unsolicited when an outgoing exchange connection changes state (e.g. due to a network error or authentication failure).
|
Tag
|
Field Name
|
Required
|
Comments
|
|---|---|---|---|
| 335 | TradSesReqID | Y | Unique identifier for the Status Request, copied from the original TradingSessionStatusRequest message |
| 336 | TradingSessionID | Y | Name of the trading destination that changed its status |
| 625 | TradingSessionSubId | Y | Account ID, associated with Exchange from TradingSessionID. TradingSessionSubId is used to clearly identify which trading session changed its status, as long as the Organization might have multiple accounts and multiple outgoing connections to the same destination. |
| 325 | UnsolicitedIndicator | Y |
Supported Values:
|
| 340 | TradSesStatus | Y |
Supported Values:
|
| 58 | Text | N |
Might contain additional information in case of the error |
Naming Convention
Axon Trade uses the following rules to keep symbol names coherent across a variety of services
| Type | Format | Security Type (167) | Base Asset | Quote Asset | Example |
|---|---|---|---|---|---|
| Crypto Spot | CCY1/CCY2 | CRYPTOSPOT | BTC | USD | BTC/USD |
| FX | CCY1/CCY2 | CRYPTOSPOT | EUR | USD | EUR/USD |
| Perpetual Swaps | security_type:base-asset:quote-asset | PERPSWAP | BTC-PERP | BTC USDT |
PERP:BTC-PERP:BTC PERP:ETH-PERP:USDT |
| Futures Contracts | security_type:base-asset:quote-asset | FUT | MAR22 | BTC | FUT:MAR22:BTC |
| Options | security_type:base-asset:quote-asset | OPT | JUL21P40000 | USDT | OPT:JUL21P40000:USDT |
Management API
Introduction
Axon Trade OEMS exposes a REST API for managing your integration — including Accounts, Exchanges, and related resources.
Resources follow a hierarchy: Accounts belong to an Organization, and Exchanges are linked to Accounts.
Authentication
Every request to the Management API must include an authentication token in the Api-Key-Token header. To generate a token, your organization administrator can create one in the Client Portal.

Accounts
Axon Trade OEMS is a multitenant platform with a three-level hierarchy:
- Organization — the top-level entity representing your company. Org-wide resources such as market data subscriptions and message quotas belong here.
- Account — holds the links to exchanges. All balances are associated with an Account. An Organization can have multiple Accounts.
- Login — authenticates and submits trading operations (open, cancel, update orders). Each Account has exactly one Login.
Get all Accounts
Request:
let response = await fetch(
"https://service.url/rest/accounts",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/accounts", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"id":1,
"name":"Office A",
"organization_id":1,
"status":1
},
{
"id":2,
"name":"Office X",
"organization_id":1,
"status":1
}
]
Returns all accounts registered under your organization.
Method and path
GET /rest/accounts/statuses?statusId=1
URL Parameters
| Parameter | Description |
|---|---|
| STATUS | Status ID |
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Incorrect/stale token provided |
| 403 | Forbidden |
Get Account by ID
Request:
let response = await fetch(
"https://service.url/rest/accounts/1",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/accounts/1", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"id":1,
"name":"Office A",
"organization_id":1,
"status":1
}
Returns a single Account by its ID.
Method and path
GET /rest/accounts/{ACCOUNT}
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Invalid token provided |
| 403 | Forbidden |
| 404 | Organization or Account with provided ID is not found |
Add Account
Body example:
{
"name": "FX UAT Account",
"status": 1,
"organization_id": 1
}
Request:
let response = await fetch(
"https://service.url/rest/accounts/",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
body: {
name: "FX UAT Account",
status: 1,
organization_id: 1
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'}, data={
"name": "FX UAT Account",
"status": 1,
"organization_id": 1
})
data = request.json()
Response:
{
"id": 75,
"name": "FX UAT Account",
"organization_id": 1,
"login": {
"id": 28,
"name": "FX UAT Account",
"account_id": 1,
"balance": 100.0
}
}
Creates a new Account under your organization. A Login is automatically created alongside it.
Method and path
POST /rest/accounts
URL Parameters
| Parameter | Description |
|---|
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Invalid token provided |
| 500 | An error occurred while processing the creation |
Add properties for account
Body example:
{
"key":"data_center_id",
"value":"1"
}
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/properties",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
body: {
key: "data_center_id",
value: "1"
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1/properties", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'}, data={
"key":"data_center_id",
"value":"1"
})
data = request.json()
Response:
{
"message":"2 new record(s) added, 0 record(s) updated"
}
Sets properties on an Account.
Method and path
POST /rest/accounts/ACCOUNT/properties
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Invalid token provided |
| 500 | An error occurred while processing the creation |
Update Account information
Body example:
{
"name": "Account 2 New Name"
}
Request:
let response = await fetch(
"https://service.url/rest/accounts/1",
{
method: "PUT",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
body: {
id: 1,
name: "Account 2 New Name",
organization_id: 1
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'}, data={"name": "Account 2 New Name"})
data = request.json()
Response:
{
"id": 1,
"name": "Account 2 New Name",
"organization_id": 1,
"status": 1
}
Updates a given Account. Currently, only the Account name can be changed.
Method and path
POST /rest/accounts
URL Parameters
| Parameter | Description |
|---|
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Invalid token provided |
| 404 | Account with given ID is not found |
| 500 | An error occurred while processing the updating |
Delete account
Request:
let response = await fetch(
"https://service.url/rest/accounts/1",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"id": 1,
"name": "Account 2",
"organization_id": 1,
"description": "some description",
"status": 1
}
Disables an Account.
Method and path
POST /rest/accounts/{ACCOUNT}
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Invalid token provided |
| 404 | Account with given ID is not found |
| 500 | An error occurred while processing the deleting |
Exchanges
These endpoints manage the links between Accounts and their trading destinations. Each Account can link to multiple exchanges, but each exchange type can only appear once per Account — for example, you cannot link two Binance accounts to the same Account. If you need multiple connections to the same exchange, create a separate Account for each one.
Get all exchanges
Request:
let response = await fetch("https://service.url/rest/exchanges", {
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
});
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/exchanges", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"id": 10,
"name": "GEMINI",
"full_name": "Gemini exchange"
},
{
"id": 12,
"name": "BITFINEX",
"full_name": "BitFinex exchange"
},
{
"id": 20,
"name": "BITMART",
"full_name": "BitMart exchange"
}
]
Returns the list of all exchanges supported by the server.
Method and path
GET /rest/exchanges
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was successfully executed |
| 401 | Invalid token provided |
| 500 | Internal server error - exchanges can't be received because of certain reasons |
Get configured exchanges
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/accounts/1/exchanges", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"id":481,
"name":"CEX.IO",
"description":"CEX PROD",
"status":1
},
{
"id":667,
"name":"OKEX",
"description":" ",
"status":0
}
]
Returns the exchanges linked to the specified Account.
Method and path
GET /rest/accounts/{account_id}/exchanges
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT_ID | Account ID |
Response Codes
| Code | Description |
|---|---|
| 200 | Exchanges (a.k.a. connectors) were successfully retrieved |
| 401 | Invalid token provided |
| 500 | Internal server error - exchanges can't be received because of certain reasons |
Add exchange to Account
Body example:
{
"route_id": 3,
"name":"Binance",
"description":"Binance | Futures | Coins description for new exchange",
"params":[
{
"key":"api_key",
"value":"111-222-333"
},
{
"key":"private_key",
"value":"4442131212"
}
]
}
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/add",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
body: {
route_id: 3,
name: "Binance",
description: "Binance | Futures | Coins description for new exchange",
params:[
{
key: "api_key",
value: "111-222-333"
},
{
key: "private_key",
value: "4442131212"
}
]
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/accounts/1/exchanges/add", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'}, {
"route_id": 3,
"name":"Binance",
"description":"Binance | Futures | Coins description for new exchange",
"params":[
{
"key":"api_key",
"value":"111-222-333"
},
{
"key":"private_key",
"value":"4442131212"
}
]
})
data = request.json()
Response:
{
"id": 757,
"name": "Binance",
"exchange": {
"id": 9,
"name": "BINANCE"
}
}
Links an exchange to an Account and activates trading on it. You must supply the required credentials (API Key, Private Key, etc.).
Method and path
POST /rest/accounts/{ACCOUNT}/exchanges/add
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 201 | Connector created but something went wrong: |
| 400 | Incomplete or incorrect data has been passed |
| 401 | Invalid token provided |
| 404 | Account ID, Router ID did not find |
| 409 | Account already has registered routing destination to target exchange or failed to create connector |
Update credentials on Exchange
Body example:
{
"private_key": "da281ca8-7a43-11ec-90d6-0242ac120003",
"api_key": "66442f2c-c7ef-404b-b01c-30f2eb8ca318"
}
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/1/edit",
{
method: "PUT",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
body: {
params:[
{
type: 2,
key: "api_key",
value: "333-222-333"
},
{
type: 2,
key: "private_key",
value: "skdjfslkdjfsldkj"
}
]
}
,
}
);
if (response.ok) {
let json = await response.text();
}
import requests
request = requests.get("https://service.url/rest/accounts/1/exchanges/1", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'}, {
"params":[
{
"type":2,
"key":"api_key",
"value":"333-222-333"
},
{
"type":2,
"key":"private_key",
"value":"skdjfslkdjfsldkj"
}
]
}
)
data = request.json()
Response:
{
"message": "Exchange ID: 757 settings has been updated"
}
Updates the credentials for a linked exchange. Use this when an exchange rotates or expires its API keys.
Method and path
POST /rest/accounts/{ACCOUNT}/exchanges/{EXCHANGE}
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
| EXCHANGE | ID of configured exchange |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 404 | Account ID, or Exchange ID is not found |
Unlink Exchange from Account
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/1/delete",
{
method: "DELETE",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.delete("https://service.url/rest/accounts/1/exchanges/1/delete", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"message": "Exchange ID: 757 has been removed"
}
Removes the link between an Exchange and the given Account. All stored credentials are deleted. Any open orders on that exchange remain open, and trading history is retained.
Method and path
DELETE /rest/accounts/{ACCOUNT}/exchanges/{EXCHANGE}
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
| EXCHANGE | ID of an exchange |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 202 | Exchange(a.k.a connector) deleted but user data not deleted |
| 401 | Invalid token provided |
| 404 | Account ID or Exchange ID not found |
| 409 | Exchange is not deleted |
Get connectivity statuses for all exchanges
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/status",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/accounts/1/exchanges/status", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"id": 95,
"status": 0,
}
]
Returns the connectivity status of all linked exchanges for the given Account. Each object represents a single exchange link.
Note that CONNECTED does not mean ready to trade. After connecting, the system synchronizes its internal state (orders, positions, trading history) with the exchange before trading is enabled.
Method and path
GET /rest/accounts/{ACCOUNT}/exchanges/status
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 404 | Account ID is not found |
Start link to Exchange
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/1/start",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1/exchanges/1/start", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"message":"Request to start connector has been sent"
}
Initiates the connection to the specified exchange. Newly created links start in DISCONNECTED status — call this endpoint to connect and begin synchronization.
Method and path
GET /rest/accounts/{ACCOUNT}/exchanges/{EXCHANGE}/start
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
| EXCHANGE | ID of an exchange |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 404 | Account ID, Exchange ID is not found |
Stop Exchange's link
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/1/stop",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1/exchanges/1/stop", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"message": "Request to stop connector has been sent"
}
Closes the outgoing connection to the specified exchange without removing the link. The exchange configuration and credentials are preserved.
Method and path
POST /rest/accounts/{ACCOUNT}/exchanges/{EXCHANGE}/stop
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
| EXCHANGE | ID of an exchange |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 404 | Account ID, Exchange ID is not found |
Get extended positions
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/1/extended_positions",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1/exchanges/1/extended_positions", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"asset": {
"id": 1043569,
"name": "PERP:XRP-PERP:USDT"
},
"size": "0.1", // size > 0 -> side = buy, size < 0 -> side = sell
"avg_price": "141.6",
"mark_price": "154.354",
"liquidation_price": "0.00",
"leverage": "1.7",
"unreleased_pnl": "1.2754"
}
]
Returns extended position data for a given account and exchange.
Method and path
POST /rest/accounts/{ACCOUNT}/exchanges/{EXCHANGE}/extended_positions
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
| EXCHANGE | ID of an exchange |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was processed correctly |
| 401 | Invalid token provided |
| 403 | Forbidden |
| 404 | Organization ID, Account ID, Exchange ID is not found |
| 500 | An error occurred during get transactions for organization |
Get balances
Request:
let response = await fetch(
"https://service.url/rest/accounts/1/exchanges/1/balances",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.post("https://service.url/rest/accounts/1/exchanges/1/balances", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"asset": {
"id": 1033342,
"name": "USDT"
},
"available": "42.39",
"locked": "9.83",
"available_value": "42.38",
"locked_value": "9.83"
}
Returns balance information for a given account and exchange.
Method and path
POST /rest/accounts/{ACCOUNT}/exchanges/{EXCHANGE}/balances
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ACCOUNT | Account ID |
| EXCHANGE | ID of an exchange |
Response Codes
| Code | Description |
|---|---|
| 200 | Request was processed correctly |
| 401 | Invalid token provided |
| 403 | Forbidden |
| 404 | Account ID, Exchange ID is not found |
| 500 | An error occurred during get transactions for organization |
Routing destinations
A route (or routing destination) represents a specific connectivity implementation between Axon Trade and an exchange. Some exchanges support multiple routes — for example, both WebSocket and FIX — each available as a separate route.
Get routing destinations
Request:
let response = await fetch(
"https://service.url/rest/routes?router_id={ROUTER}",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/routes/?router_id={ROUTER}", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"id":37,
"name":"BITMEX",
"exchange":{
"id":16,
"name":"BITMEX"
}
},
{
"id":68,
"name":"LIQUID",
"exchange":{
"id":66,
"name":"LIQUID"
}
}
]
Returns all routing destinations supported by the server.
Method and path
GET /rest/routes?router_id={ROUTER}
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ROUTER | Router ID |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 404 | ROUTER ID is not found |
Get route description
Request:
let response = await fetch(
"https://service.url/rest/routes/{ROUTE}",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/routes/1", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
{
"id":59,
"name":"Binance|Spot",
"settings":[
{
"key":"api_key",
"value":null
},
{
"key":"private_key",
"value":null
}
]
}
Returns the details of a specific route, including the parameters required to connect (e.g. API Key, Private Key). These are the credentials you'll need to supply when linking an exchange to an Account.
Method and path
GET /rest/routes/
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
URL Parameters
| Parameter | Description |
|---|---|
| ROUTE | Routing Destination ID |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 404 | Route ID is not found |
Datacenters
Get Datacenters
Request:
let response = await fetch(
"https://service.url/rest/datacenter",
{
headers: {
"Content-Type": "application/json",
"Api-Key-Token": "sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw",
},
}
);
if (response.ok) {
let json = await response.json();
}
import requests
request = requests.get("https://service.url/rest/datacenter", {'Api-Key-Token': 'sHBXSvuk3fF2MKigsUI1AAAA1AAAgABYXJ0aHVyLnJhZGNoZW5rbw', 'Content-Type': 'application/json'})
data = request.json()
Response:
[
{
"id":1,
"name":"NewYork",
"description":"description",
"location":"NY"
},
{
"id":5,
"name":"London",
"description":"London DC",
"location":"LD"
}
]
Returns the list of all available datacenters.
Method and path
GET /rest/datacenter
Headers
| Name | Value |
|---|---|
| Content-Type | application/json |
| Api-Key-Token | your API token |
Response Codes
| Code | Description |
|---|---|
| 200 | Operation is accomplished successfully |
| 401 | Invalid token provided |
| 500 | An error occurred during get all datacenters |
Constants
Exchange connection statuses
| Status ID | Meaning |
|---|---|
| 0 | DISCONNECTED |
| 1 | DISCONNECTING |
| 2 | CONNECTING |
| 3 | CONNECTED |
| 4 | AWAIT SUBSCRIBE |
| 5 | AUTH REQUIRED |
| 6 | AUTH FAILED |
Extended Statuses
| Status ID | Meaning |
|---|---|
| 2000 | Sync open orders |
| 2001 | Orders synchronization failed |
| 2002 | Sync trading history |
| 2003 | Trading history synchronization failed |
| 2004 | Sync positions |
| 2005 | Positions synchronization failed |
| 2006 | Ready to Trade |
| 2007 | Trading Disabled |
UAT Environment
Introduction
The UAT environment lets you complete your integration without using real funds. To get started, create or use existing test credentials for one of the supported exchanges below.
Important: never use production credentials in the UAT environment.
| Exchange | URL | Comments |
|---|---|---|
| Deribit | https://test.deribit.com/ | |
| Coinbase Pro | https://public.sandbox.pro.coinbase.com/ | |
| OKX | https://www.okx.com/learn/how-to-practice-trading-crypto-on-okx-with-demo-trading | |
| ByBit | https://www.bybit.com/en/derivative-activity/demo-trading | |
| BitMEX | https://testnet.bitmex.com/ |
Available instruments
| Exchange | Internal exchange name | Symbol | Native Name |
|---|---|---|---|
| Deribit | DERIBIT | PERP:BTC-PERP:BTC | BTC-PERPETUAL |
| PERP:ETH-PERP:ETH | ETH-PERPETUAL | ||
| PERP:BTC-PERP:USDC | BTC_USDC-PERPETUAL | ||
| Coinbase Pro | COINBASE | BTC/USD | BTC-USD |
| ETH/USD | ETH-USD | ||
| LTC/USD | LTC-USD | ||
| OKX | OKEX | BTC/USDT | BTC-USDT |
| ETH/USDT | ETH-USDT | ||
| LTC/USDT | LTC-USDT | ||
| PERP:BTC-PERP:BTC | BTC-USD-SWAP | ||
| PERP:ETH-PERP:ETH | ETH-USD-SWAP | ||
| PERP:LTC-PERP:LTC | LTC-USD-SWAP | ||
| ByBit | BYBIT | PERP:BTC-PERP:BTC | BTCUSD |
| PERP:BTC-PERP:USDT | BTCUSDT | ||
| BTC/USDT | BTCUSDT | ||
| BTC/USDC | BTCUSDC | ||
| ETH/BTC | ETHBTC | ||
| PERP:ETH-PERP:ETH | ETHUSD | ||
| PERP:ETH-PERP:USDT | ETHUSDT | ||
| ETH/USDT | ETHUSDT | ||
| ETH/USDC | ETHUSDC | ||
| BitMEX | BITMEX | PERP:BTC-PERP:BTC | XBTUSD |
| PERP:BTC-PERP:USDT | XBTUSDT | ||
| PERP:ETH-PERP:BTC | ETHUSD | ||
| PERP:ETH-PERP:USDT | ETHUSDT |