API Specification
Introduction
The FIX (Financial Information eXchange) protocol is a widely adopted and time-tested standard for exchanging trading-related messages in capital markets. It is used for sending buy/sell orders, receiving market data, managing executions, and more.
Flowlink builds upon the FIX 4.4 specification, with minor customizations to support efficient market data streaming and trade execution between institutional takers and liquidity providers.
For additional background on FIX, refer to the official FIX Trading Community site: https://www.fixtrading.org/
Session Types
Flowlink supports two distinct FIX sessions:
| Session Type | Purpose |
|---|---|
| Market Data | Used to receive or stream market data, including quote requests and price updates |
| Trading | Used for order-related communication, such as sending new orders, cancel requests, and receiving execution confirmations |
Each session:
- Requires authentication credentials
- SSL/TLS encryption is mandatory for the Trading session, while the Market Data session does not use SSL/TLS.
Integration Support
Flowlink provides a dedicated UAT (demo) environment for integration and testing. We also offer example code and FIX dictionaries for common engines, including:
Maintenance
To ensure low-latency performance, stability, and security, Flowlink is subject to routine maintenance and deployment procedures. These updates are carefully scheduled to minimize operational impact and improve service continuity.
Unlike traditional systems with lengthy restart windows, Flowlink upgrades are designed to complete within approximately 5 seconds. However, clients should still be prepared for brief connection interruptions during the maintenance window.
Maintenance Schedule
| Datacenter | Start Time (UTC) | Expected Duration |
|---|---|---|
| LD4 (London) | 02:00 UTC | ~5 seconds |
| NY4 (New York) | 08:00 UTC | ~5 seconds |
During this time, both Market Data and Trading sessions may briefly disconnect and reconnect automatically.
If you require coordination for specific maintenance events, please contact the support team in advance.
Naming Convention
Axon Trade uses the following standardized naming rules to maintain consistency across its trading infrastructure.
| Instrument Type | Symbol Format | CFICode (Symbol) | Base Asset CFICode | Quote Asset CFICode | Example Symbol |
|---|---|---|---|---|---|
| Crypto Spot | BASE/QUOTE | DCTXXX | DCTXXX | DCTXXX or DSTXXX | BTC/USDT, ETH/USDC |
| Crypto–Fiat Spot | BASE/QUOTE | DCTXXX | DCTXXX | FCFXXX | BTC/USD, ETH/EUR |
| FX | BASE/QUOTE | FCFXXX | FCFXXX | FCFXXX | EUR/USD, JPY/CHF |
| Perpetual Swaps | PERP:BASE-PERP:QUOTE | DFPXXX | DFPXXX | DCTXXX | PERP:BTC-PERP:BTC |
| Futures Contracts | FUT:EXPIRY:QUOTE | DFXXXX | DFXXXX | DCTXXX | FUT:MAR22:BTC |
| Options | OPT:EXPIRY_STRIKE:QUOTE | DOCXXX | DOCXXX | DCTXXX or DSTXXX | OPT:JUL21P40000:USDT |
| Stocks | TICKER | ESXXXX | ESXXXX | FCFXXX | AAPL, GOOGL, TSLA |
Notes:
- Symbol CFICode is based on the nature of the base asset, except for futures/options where a contract CFICode is used.
- Stablecoins (e.g., USDT, USDC) use DSTXXX.
- Fiat currencies use FCFXXX.
- Crypto tokens use DCTXXX.
- CFICodes are used both for individual assets and entire trading symbols, enabling easier classification and filtering.
Market Data Session
The Market Data session in Flowlink is used to transmit pricing information and quotes from liquidity providers to Flowlink in response to quote requests.
Unlike systems that stream incremental order book updates, Flowlink uses full snapshots to represent pricing. These are delivered using the MarketDataSnapshotFullRefresh (MsgType = W) message format.
Message Format
Each MarketDataSnapshotFullRefresh message must include a complete snapshot of active price levels (bid and/or ask). This approach ensures downstream systems receive consistent and self-contained pricing data without needing to track incremental changes.
Behavior and Expectations
- Snapshots are sent in response to
MarketDataRequest(MsgType = V). - Each snapshot must carry the same
MDReqIDas the request it responds to. - Multiple price levels per side are supported (subject to system-defined depth).
- Snapshots should be refreshed as market conditions change or at regular intervals based on quoting logic.
Message Structure
Flowlink uses a slightly customized implementation of FIX 4.4 for both market data and trading sessions. All messages follow the standard FIX envelope format, which includes a header, body, and footer.
Header Fields
| Tag | Field Name | Required | Description |
|---|---|---|---|
| 8 | BeginString | Yes | Identifies the start of the FIX message and specifies the protocol version. Always set to FIX.4.4. |
| 9 | BodyLength | Yes | Byte length of the message body, calculated from tag 35 to tag 10 (exclusive). |
| 35 | MsgType | Yes | Identifies the type of message (e.g., A for Logon, W for MarketDataSnapshotFullRefresh). |
| 49 | SenderCompID | Yes | Assigned identifier of the message sender. |
| 56 | TargetCompID | Yes | Assigned identifier of the message receiver. Flowlink sessions use values like FLOWLINK-MD-NY4-1 or FLOWLINK-MD-LD4-1. |
| 34 | MsgSeqNum | Yes | Sequential number of the message within a session. |
| 52 | SendingTime | Yes | Time the message was sent, in UTC, using the YYYY-MM-DDThh:mm:ss.SSS format. |
Footer Fields
| Tag | Field Name | Required | Description |
|---|---|---|---|
| 10 | CheckSum | Yes | Simple three-byte checksum of all bytes in the message prior to this tag, used for message integrity validation. |
Messages
This section outlines the core FIX messages used by Flowlink for session management and market data delivery.
Logon
(MsgType = A)
Direction: IN / OUT
Purpose: Initiates a FIX session and performs authentication.
The Logon message must be the first message sent after establishing a TCP connection. Upon successful authentication, Flowlink will respond with a Logon message.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 98 | EncryptMethod | Yes | Must be 0 (None). |
| 108 | HeartBtInt | Yes | Requested heartbeat interval in seconds (recommended: 5). |
| 141 | ResetSeqNumFlag | No | Indicates sequence number reset on both sides. Must be set to Y for Market Data sessions. |
| 553 | Username | Yes* | Username for authentication. Required in incoming Logon only. |
| 554 | Password | Yes* | Password for authentication. Required in incoming Logon only. |
Logout
(MsgType = 5)
Direction: IN / OUT
Purpose: Closes a FIX session or provides context for disconnection.
Logout messages are used to terminate a session or signal session-level issues. Either side may initiate a logout.
Optional Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 58 | Text | No | Human-readable disconnection reason (e.g., authentication failure). This field may be omitted. |
SecurityListRequest
(MsgType = x)
Direction: OUT
Purpose: Used to request the list of all tradable instruments on a specific exchange.
This message allows a counterparty to query Flowlink for available instruments by specifying the target exchange. Flowlink will respond with a corresponding SecurityList (MsgType = y) message.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 320 | SecurityReqID | Yes | Unique identifier for the request. Must be echoed in the response. |
| 559 | SecurityListRequestType | Yes | Type of security list being requested. Only supported value: 4 (All Securities). |
| 207 | SecurityExchange | Yes | Identifier of the exchange whose instrument list is being requested. |
SecurityList
(MsgType = y)
Direction: IN
Purpose: Returns a list of tradable instruments matching the criteria specified in a prior SecurityListRequest.
Because the list of instruments can be large, Flowlink returns one instrument per message. The combination of TotNoRelatedSym and LastFragment can be used to determine when the full transmission is complete.
Required and Conditional Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 320 | SecurityReqID | Yes | Echoes the SecurityReqID from the initiating request. |
| 322 | SecurityResponseID | Yes | Unique identifier for this response message. |
| 560 | SecurityRequestResult | Yes | Indicates the result of the request. Supported values: 0 – Valid request 1 – Invalid or unsupported request 2 – No instruments matched 3 – Not authorized |
| 393 | TotNoRelatedSym | No | Total number of instruments matching the criteria. Used for fragmentation tracking. |
| 893 | LastFragment | No | Indicates whether this is the final message in the sequence (Y = yes, N = no). |
| 58 | Text | Conditional | Optional human-readable error message. Only included when applicable. |
Instrument Block
(NoRelatedSym)
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 146 | NoRelatedSym | Conditional | Always 1 if the request was successful (one instrument per message). |
Inside Instrument Block:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 55 | Symbol | Conditional | Instrument symbol, e.g. ETH/BTC. |
| 207 | SecurityExchange | Conditional | Exchange identifier for the instrument. |
| 5001 | Price Precision | Conditional | Number of decimal places supported in price. |
| 5002 | Size Precision | Conditional | Number of decimal places supported in order size. |
| 562 | MinTradeVol | Conditional | Minimum trading volume allowed for the symbol. |
Underlying Instruments
(NoUnderlyings Group)
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 711 | NoUnderlyings | Conditional | Always 2 for composite/derivative instruments. |
Inside Each Underlying:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 311 | UnderlyingSymbol | Conditional | Symbol of the underlying asset. |
| 463 | UnderlyingCFICode | Conditional | CFICode of the underlying asset. Examples: FCFXXX – Fiat (USD, EUR) DCTXXX – Crypto tokens (BTC, ETH) DSTXXX – Stablecoins (USDT, USDC) DFPXXX – Perpetual futures DFXXXX – Futures ESXXXX – Stocks DOCXXX – Options |
| 5002 | Size Precision | Conditional | Number of decimal places allowed for the underlying's order size. |
MarketDataRequest
(MsgType = V)
| Role | Direction |
|---|---|
| Taker | OUT |
| Maker | IN |
Purpose: Initiates a subscription to market data snapshots for one or more symbols on specified exchanges.
Flowlink responds to valid requests with MarketDataSnapshotFullRefresh messages.
Unsubscribing:
To unsubscribe, send a MarketDataRequest with SubscriptionRequestType = 2 (Disable). All required fields must be present.
Only full unsubscription is supported (Symbol = ALL). Partial unsubscription is not available.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 262 | MDReqID | Yes | Unique request ID. Echoed in responses. |
| 263 | SubscriptionRequestType | Yes | 1 – Subscribe 2 – Unsubscribe |
| 264 | MarketDepth | Yes | 0 – Full book |
| 265 | MDUpdateType | Yes | 0 – Full Refresh |
| 267 | NoMDEntryTypes | Yes | Must include two entries: Bid (0) and Offer (1) |
| ↳ 269 | MDEntryType | Yes | Entry type: 0 – Bid, 1 – Offer |
| 146 | NoRelatedSym | Yes | One or more instruments to subscribe to |
| ↳ 55 | Symbol | Yes | Instrument symbol (e.g. ETH/BTC) |
| ↳ 207 | SecurityExchange | Yes | Exchange identifier (e.g. FLOWTRADERS) |
MarketDataRequestReject
(MsgType = Y)
| Role | Direction |
|---|---|
| Taker | IN |
| Maker | OUT |
Purpose: Sent in response to a failed MarketDataRequest. This message provides details about the rejection reason.
If a MarketDataRequest included multiple instruments and one or more were invalid, the rejection will reference the first error encountered only.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 262 | MDReqID | Yes | Request ID of the original MarketDataRequest. |
| 281 | MDReqRejReason | Yes | Rejection reason: 0 – Unknown symbol 1 – Duplicated MDReqID 3 – Insufficient permissions D – Unknown MDReqID E – Unknown SecurityExchange F – Quote provider is offline |
| 58 | Text | Yes | Human-readable explanation of the rejection reason. |
MarketDataSnapshotFullRefresh
(MsgType = W)
| Role | Direction |
|---|---|
| Taker | IN |
| Maker | OUT |
Purpose: Delivers a full snapshot of the order book for a specific instrument on a specific exchange, in response to a MarketDataRequest with MDUpdateType = 0 (Full Refresh).
The number of entries included depends on the MarketDepth value specified in the original request.
Book Reset Events
In the case of a book reset (e.g. when a quote is withdrawn or conditions change), Flowlink sends a special MarketDataSnapshotFullRefresh message containing two entries:
- One for BID (
MDEntryType = 0) - One for OFFER (
MDEntryType = 1)
In both entries:
MDEntryPx = 0MDEntrySize = 0
This serves as an instruction to the receiver to invalidate all current price levels for the instrument. There is no need to re-subscribe; updates will resume automatically when available.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 262 | MDReqID | Yes | Request ID being responded to. |
| 55 | Symbol | Yes | Name of the instrument (e.g. ETH/BTC). |
| 207 | SecurityExchange | Yes | Exchange identifier. |
| 83 | RptSeq | Yes | Incremental sequence number (can be used to track update ordering). |
| 268 | NoMDEntries | Yes | Number of entries in the snapshot. Typically one per price level. |
Inside MDEntries Group:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 269 | MDEntryType | Yes | 0 – Bid, 1 – Offer |
| 270 | MDEntryPx | Yes | Price at this level |
| 271 | MDEntrySize | Yes | Quantity available at this price |
| 299 | QuoteEntryID | Conditional | Included when the entry corresponds to a firm quote |
| 272 | MDEntryDate | Yes | Last update date (UTC, ISO 8601 format) |
| 273 | MDEntryTime | Yes | Last update time (UTC) |
Trading Session
The Trading session is used to send orders to liquidity providers and to receive execution feedback via asynchronous ExecutionReport messages.
Flowlink FIX sessions operate as fully asynchronous communication channels — clients do not need to poll for updates. Any changes to an order’s status (e.g., accepted, filled, canceled) are pushed automatically in real time.
By default, a single trading session can route orders across multiple exchanges or venues, simplifying integration. For more advanced use cases, access control rules can be applied to control routing behavior.
Order Lifecycle
Once an order is submitted (NewOrderSingle), the client will receive an ExecutionReport in response with one of the following initial statuses (OrdStatus):
- PENDING_NEW — Order accepted for processing
- REJECTED — Order failed validation and was not forwarded
If accepted (PENDING_NEW), the order may proceed through the following states:
- NEW — Order has been accepted by the target venue
- PARTIALLY_FILLED — Order executed partially
- FILLED — Order fully executed
- CANCELED — Order was canceled, either by client request or venue-side logic (e.g., TimeInForce expiration)
Dictionaries
CFICode (Classification of Financial Instruments)
| CFICode | Description |
|---|---|
| FCFXXX | Fiat currencies (e.g., USD, EUR, JPY) |
| DCTXXX | Crypto tokens (e.g., BTC, ETH, SOL) |
| DSTXXX | Stablecoins (e.g., USDT, USDC) |
| DFPXXX | Perpetual futures contracts (e.g., BTC-PERP) |
| DFXXXX | Standard futures contracts |
| ESXXXX | Stocks |
| DOCXXX | Options |
Order Types
(OrdType)
Flowlink supports the following order types:
| Type | Description |
|---|---|
| 1 | Market — No price required. Executes at best available price. |
| 2 | Limit — Requires Price (44) to be set. |
| D | Previously Quoted — Used for RFQ-based IOC/FOK orders that refer to a quote via QuoteID. |
Order Sides
(Side)
Only two sides are supported:
- 1 – Buy
- 2 – Sell
Time in Force
(TimeInForce)
Flowlink supports the following values:
| Type | Description |
|---|---|
| 3 | Immediate Or Cancel (IOC) — Executes partially or fully immediately; unfilled portion is canceled |
| 4 | Fill Or Kill (FOK) — Must be fully filled immediately or canceled entirely |
Messages
Logon
(MsgType = A)
Purpose: Initiates the FIX session and performs authentication.
This must be the first message sent after establishing the TCP connection. Upon successful authentication, Flowlink responds with a corresponding Logon message.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 98 | EncryptMethod | Yes | Always set to 0 (None) |
| 108 | HeartBtInt | Yes | Heartbeat interval (always 30) |
| 553 | Username | Yes | Session username |
| 554 | Password | Yes | Session password |
Logout
(MsgType = 5)
| Role | Direction |
|---|---|
| Client | IN/OUT |
| Server | IN/OUT |
Purpose: Terminates the session or communicates a session-level error. Can be initiated by either party.
Optional Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 58 | Text | No | Human-readable explanation for the disconnection. May be omitted. |
NewOrderSingle
(MsgType = D)
| Role | Direction |
|---|---|
| Taker | OUT |
| Maker | IN |
Purpose: Used to submit a new order for execution.
This includes market, limit, or previously quoted (RFQ-based) orders.
The message must specify the symbol, side, venue, and order parameters.
Required & Conditional Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 11 | ClOrdID | Yes | Unique client-assigned order ID (max 50 characters) |
| 38 | OrderQty | Yes | Total order quantity |
| 40 | OrdType | Yes | Order type: 1 – Market 2 – Limit D – Previously Quoted |
| 44 | Price | Cond. | Required for Limit orders (OrdType =) |
| 54 | Side | Yes | Order side: 1 – Buy 2 – Sell |
| 55 | Symbol | Yes | Instrument symbol (e.g., ETH/BTC) |
| 59 | TimeInForce | Yes | Only supported values: 3 – IOC 4 – FOK |
| 60 | TransactTime | Yes | Timestamp of order submission (UTC, with milliseconds) |
| 100 | ExDestination | Yes | Target exchange or ECN identifier |
| 461 | CFICode | Yes | Classification of financial instrument: DCTXXX – Crypto spot DFPXXX – Perpetual swap FCFXXX – Fiat FX DFXXXX – Futures |
| 117 | QuoteID | Cond. | Required if OrdType = D (Previously Quoted) |
ExecutionReport
(MsgType = 8)
| Role | Direction |
|---|---|
| Taker | IN |
| Maker | OUT |
Purpose: Reports the status of an order — such as acknowledgment, fill, cancellation, or rejection.
This message is sent by the liquidity provider (maker) to Flowlink and forwarded to the taker.
It is also used internally by Flowlink to reflect lifecycle transitions.
Required & Conditional Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 11 | ClOrdID | Yes | Client-assigned order ID |
| 37 | OrderID | Yes | Internal Flowlink-assigned order ID |
| 17 | ExecID | Yes | Unique ID for this execution report |
| 40 | OrdType | Yes | Order type: 1 – Market 2 – Limit D – Previously Quoted |
| 44 | Price | Cond. | Present for Limit orders |
| 54 | Side | Yes | 1 – Buy 2 – Sell |
| 55 | Symbol | Yes | Instrument symbol |
| 59 | TimeInForce | Yes | Only supported values: 3 – IOC 4 – FOK |
| 39 | OrdStatus | Yes | Current order state: A – Pending New 0 – New 1 – Partially Filled 2 – Filled 4 – Canceled 8 – Rejected |
| 150 | ExecType | Yes | Type of execution report: 0 – New F – Trade 4 – Canceled 8 – Rejected |
| 6 | AvgPx | Yes | Average price across all fills |
| 31 | LastPx | Cond. | Price of the last fill (if applicable) |
| 32 | LastQty | Cond. | Quantity of the last fill (if applicable) |
| 14 | CumQty | Yes | Total filled quantity |
| 151 | LeavesQty | Yes | Remaining quantity (unfilled portion) |
| 58 | Text | Cond. | Optional free-text reason or explanation (e.g., rejection details) |
| 60 | TransactTime | Yes | Timestamp of this report (UTC with milliseconds) |
| 100 | ExDestination | Yes | Execution venue (exchange/ECN identifier) |
| 103 | OrdRejReason | Cond. | Present when OrdStatus = 8 (Rejected). Supported values: 0 – Broker option 1 – Unknown symbol 2 – Exchange closed 3 – Exceeds limits 4 – Too late to enter 5 – Unknown order 6 – Duplicate order ID 11 – Unsupported characteristics 13 – Incorrect quantity 15 – Unknown account 50 – Too many requests 99 – Other |
| 461 | CFICode | Yes | Instrument classification: DCTXXX – Crypto spot DFPXXX – Perpetual swap FCFXXX – Fiat FX DFXXXX – Futures |
| 12 | Commission | Cond. | Execution commission (only present for orders in PARTIALLY_FILLED or FILLED) |
| 13 | CommissionType | Cond. | Must be 3 – Absolute (only for filled/partially filled orders) |
| 479 | CommissionCurrency | Cond. | Currency in which commission was charged (e.g., USD, USDT) |
OrderCancelRequest
(MsgType = F)
| Role | Direction |
|---|---|
| Taker | OUT |
| Maker | IN |
Purpose: Used to cancel an existing order.
Only orders in NEW or PARTIALLY_FILLED status are eligible for cancellation.
If you intend to change the remaining quantity or price, use Order Cancel/Replace Request instead.
Required Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 11 | ClOrdID | Yes | Client-generated ID for this cancel request (max 50 characters) |
| 37 | OrderID | Yes | Flowlink-assigned ID of the order to be canceled |
| 41 | OrigClOrdID | Yes | Original client order ID of the order being canceled |
| 54 | Side | Yes | Order side: 1 – Buy 2 – Sell |
| 55 | Symbol | Yes | Instrument symbol (e.g. ETH/USD) |
| 60 | TransactTime | Yes | Timestamp of cancel request (UTC with milliseconds) |
OrderCancelReject
(MsgType = F)
| Role | Direction |
|---|---|
| Taker | IN |
| Maker | OUT |
Purpose: Sent by the server (or maker) in response to a failed Order Cancel Request.
Contains details about the reason the cancellation could not be processed.
Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 11 | ClOrdID | Conditional | ID of the cancel request sent by the client (max 50 characters) |
| 41 | OrigClOrdID | Conditional | Original client order ID of the order being canceled |
| 37 | OrderID | Conditional | Internal order ID from prior ExecutionReport |
| 102 | CxlRejReason | Yes | Reason the cancel was rejected: 0 – Too late to cancel 1 – Unknown order 2 – Broker/Exchange option 4 – Unable to process 99 – Other |
| 434 | CxlRejResponseTo | Yes | Always 1 – Response to Order Cancel Request |
| 58 | Text | Optional | Human-readable description of the failure |
| 60 | TransactTime | Yes | UTC timestamp with milliseconds of the rejection |
TradingSessionStatusRequest
(MsgType = g)
| Role | Direction |
|---|---|
| Taker | OUT |
| Maker | IN |
Purpose: Sent by the client to query and subscribe to updates on the status of all outbound trading connections.
Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 335 | TradSesReqID | Yes | Unique ID for this request |
| 263 | SubscriptionRequestType | Yes | 1 – Snapshot plus Updates |
TradingSessionStatus
(MsgType = h)
| Role | Direction |
|---|---|
| Taker | IN |
| Maker | OUT |
Purpose: Sent by the server in response to a TradingSessionStatusRequest, or asynchronously whenever the connectivity status of any trading destination changes.
Fields:
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| 335 | TradSesReqID | Yes | Copied from the original request |
| 336 | TradingSessionID | Yes | Name of the trading destination (e.g., DERIBIT) |
| 325 | UnsolicitedIndicator | Yes | N – response to request (snapshot) Y – real-time update |
| 340 | TradSesStatus | Yes | 2 – OPEN 3 – CLOSED 6 – REQUEST REJECTED |
| 58 | Text | Optional | Error message or additional details |