NAV
javascript python

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:

Workflow

Messages Structure

The Feed server uses a slightly modified FIX 4.4 specification (see Market Data Incremental Refresh).

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:
  • FIX.4.4
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:
  • AXON-MD-NY4-1
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"))

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:
  • 0 - None
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:
  • 4 - All Securities
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:
  • 0 - Valid request
  • 1 - Invalid or unsupported request
  • 2 - No instruments found that match the selection criteria
  • 3 - Not authorized to retrieve instruments data
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.
  • FCFXXX – Fiat currencies (e.g., EUR, USD)
  • DCTXXX – Crypto tokens (e.g., BTC, ETH, SOL)
  • DSTXXX – Stablecoins (e.g., USDC, USDT)
  • DFPXXX – Perpetual futures contracts (e.g., PERP:BTC-PERP:BTC)
  • DFXXXX – Futures contracts
  • ESXXXX – Stocks
  • DOCXXX – Options
  ↦↦   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:
  • 1 - Snapshot plus Updates
  • 2 - disable previous Snapshot plus Updates request
264 MarketDepth Y The field used to specify the number of bids/asks to receive.
Supported Values:
  • 0 - Full book
265 MDUpdateType Y Supported values:
  • 1 - Incremental updates
  • 0 - Full Refresh (valid only for Flowlink product)
267 NoMDEntryTypes Y You can choose one or several values
269 MDEntryType Y Supported Values:
  • 0 - BID
  • 1 - OFFER
  • 2 - TRADE
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
  • 0 - Unknown symbol
  • 1 - Duplicated MDReqID
  • 3 - Insufficient Permissions
  • E - Unknown SecurityExchange
  • D - Unknown MdReqID
  • F - Quotes provider is offline
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:
  • 0 - BID
  • 1 - OFFER
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:
  • 0 - NEW
  • 1 - CHANGE
  • 2 - DELETE
  • 3 - RESET
For trade event should be NEW
269 MDEntryType Y Supported Values:
  • 0 - BID
  • 1 - OFFER
  • 2 - TRADE
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:
  • 0 - BID
  • 1 - ASK
  • 2 - UNDEFINED
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):

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:

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:
  • Market(1)
  • Limit(2)
  • Stop(3)
  • Stop/Limit(4)
  • Previously quoted(D)
44 Price C Conditional field, indicating an expected fill price.
Required for:
  • Limit
99 StopPx C Conditional field, required for Stop order type
54 Side Y Order side used
Supported Values:
  • Buy(1)
  • Sell(2)
55 Symbol Y Symbol name
59 TimeInForce Y Control orders lifetime behavior.
Supported Values:
  • Day(0)
  • Good till Cancel(1)
  • Immediate or Cancel(3)
  • Fill Or Kill(4)
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:
  • CRYPTOSPOT - Digital Assets spot market contract
  • PERPSWAP - Digital Asset perpetual swap contract
  • FOR - Foreign exchange contract
  • FUT - Futures contract
18 ExecInst N Instructions for orders handling during execution.
Supported values:
  • Participate, don't initiate(6) - POST-ONLY
  • Do Not Increase(E)
  • No Cross(A)
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:
  • 0 - Too late to cancel
  • 1 - Unknown order(send when at least one of order related fields are missed, contains incorrect information or order can't be found)
  • 2 - Broker/Exchange option
  • 4 - Unable to Process
  • 99 - Other
434 CxlRejResponseTo Y Supported Values:
  • 1 - Order Cancel Request
  • 2 - Order Cancel/Replace Request
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:
  • Market(1)
  • Limit(2)
  • Stop(3)
  • Stop/Limit(4)
  • Previously quoted(D)
44 Price Y Conditional field, indicating expected fill price for Limit orders
54 Side Y Order side used
Supported Values:
  • Buy(1)
  • Sell(2)
55 Symbol Y Symbol name
39 OrdStatus Y Reports current order status
Supported values:
  • PENDING NEW(A)
  • NEW(0)
  • PARTIALLY FILLED(1)
  • FILLED(2)
  • CANCELED(4)
  • REJECTED(8)
150 ExecType Y Reports current execution status:
Supported values:
  • NEW(0)
  • TRADE(F)
  • CANCELED(4)
  • REJECTED(8)
  • ORDER STATUS(I)
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:
  • Day(0)
  • Good till Cancel(1)
  • Immediate or Cancel(3)
  • Fill Or Kill(4)
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
  • Broker Option(0)
  • Unknown Symbol(1)
  • Exchange Closed(2)
  • Exceeds Limits(3)
  • Too Late(4)
  • Unknown Order(5)
  • Duplicated Order ID(6)
  • Unsupported Order Characteristics(11)
  • Incorrect Quantity(13)
  • Unknown Accounts(15)
  • Too Many Requests(50)
  • Other(99)
167 SecurityType Y Type of security.
Supported values:
  • FOR - Foreign Exchange Contract
  • CRYPTOSPOT - Digital Assets spot market contract
  • PERPSWAP - Digital Asset perpetual swap contract
  • FUT - Futures contract
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:
  • Absolute(3)
Only orders in status PARTIALLY_FILLED(1) or FILLED(2) have this tag set.
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:
  • Participate, don't initiate(6) - POST-ONLY
  • Do Not Increase(E)
  • No Cross(A)

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:
  • 7 - status for all orders that belong to Organization
  • 8 - status for orders that belong to a certain PartyID. In this case, additional information should be provided using the NoPartyIds group. It is possible to provide more than one PartyID at once.
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:
  • 6 - Introducing Firm(Organization ID in Axon Trade terminology)
  • 11 - Order Origination Trader(Login in Axon Trade terminology)
  • 22 - Exchange

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:
  • Position(0)
263 SubscriptionRequestType Y Used to subscribe or unsubscribe from reports.
Supported values:
  • Snapshot(0)
  • Snapshot and Updates(1)
  • Disable previous Snapshot and Updates request(2)
1 Account Y Organization ID
581 AccountType Y Type of account associated with a position request
Supported values:
  • 1 - Account
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:
  • 6 - Introducing Firm
  • 11 - Order Origination Trader
  • 22 - Exchange
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:
  • 0 - Valid Request
  • 1 - Invalid or Unsupported request
  • 2 - No positions found
  • 3 - Not authorized to request positions
729 PosReqStatus Y Status of request for positions.
Supported values:
  • 0 - Completed
  • 2 - Rejected
453 NoPartyIDs Y  
448 PartyID    
452 PartyRole   Supported values:
  • 11 - Order Origination Trader(Login ID)
  • 22 - Exchange
1 Account Y Organization ID
581 AccountType Y Type of account associated with a position request
Supported values:
  • 1 - Account
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:
  • Position owner(Order Origination Trader)
  • Exchange
448 PartyID    
452 PartyRole N Supported values:
  • 11 - Order Origination Trader
  • 22 - Exchange
1 Account Y Organization ID
581 AccountType Y Type of account associated with a position request
Supported values:
  • 1 - Account
55 Symbol Y Human readable asset name
167 SecurityType Y Supported values:
  • CRYPTOSPOT
  • PERPSWAP
  • FUT
702 NoPositions Y  
703 PosType   Supported Values:
  • ETR - Electronic Trade Qty
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:

  • 1 - Snapshot plus Updates

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:

  • N - message sent as a response to the initial command(this is a snapshot)
  • Y - message sent as a response to real-time changes in exchange connectivity status
340 TradSesStatus Y

Supported Values:

  • 2 - OPEN
  • 3 - CLOSED
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:

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

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

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

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