FIX Protocol

FIX Implementation Details

Overview

This document describes the Financial Information Exchange (FIX) implementation of the Bakkt order execution protocol. FIX provides an open standard that leverages the development and production efforts of securities transactions and standardizes requirements for accuracy and consistency. NOTE: Messages are in FIX 4.2 format (any exceptions are noted).

Table of Contents

๐Ÿ“˜

Maintenance Window

Bakkt sessions reset daily following a maintenance window when the system is offline. The maintenance window runs from 4:30PM-5:05PM CT, but after some time clients can request to remove this maintenance window to be once a month.

Gateway Messages

After establishing and testing the FIX Gateway Bakkt and the client communicate via session and application messages. Bakkt sends clients the application message configurations during the technical integration process. These messages include the following:

  • NewOrderSingle - Clients submit investor cryptocurrency orders via this message. Clients can submit orders on any tradeable cryptocurrency symbol via a single session. Bakkt only supports market orders via this message.
  • Execution Report - This is how order acknowledgements are communicated from Bakkt to the client along with any cancels, rejects, or order fills for clients' investors.
  • OrderCancelRequest - Clients submit order cancellations using this message.
  • OrderCancelReject - If Bakkt does not accept an order, or if there are insufficient funds to reconcile a cryptocurrency purchase, this message contains the order cancellation details.

Data Types

Data types are the attributes that Bakkt uses to interpret data in a consistent format with correct values so that each attribute performs as expected. Bakkt supports the following data types in its FIX implementation. NOTE: ASCII stands for American Standard Code for Information Interchange and provides the numerical representation of characters for formatting purposes.

TypeDescription
IntSigned 64-bit capacity integer (consists of ASCII characters '-' and '0' - '9'); only the first character can be a minus sign if the integer value is negative; leading zeroes are allowed but not spaces
FloatSigned decimal value (consists of ASCII characters '-', '.' and '0' - '9'); only the first character may be a minus sign if the decimal value is negative; leading zeroes are allowed; users may omit trailing zeroes after the decimal point or leading zeroes before the decimal point (supports up to nine decimal places and 16 significant digits)
CharSingle character of any alphanumeric value except the delimiter (ASCII 1-SOH); values are case-sensitive
BooleanA char field containing only 'Y' or 'N' (for Yes or No)
StringA sequence of one or more characters consisting of any alphanumeric value except the delimiter
DateCalendar date represented in YYYYMMDD format (e.g., 20221103)
UtctimestampDate/Time combination represented in UTC/GMT with millisecond precision using the format YYYYMMDD-HH-MM-SS.sss

Message Headers and Trailers

The following definitions provide information for standard FIX headers and trailers that clients send to Bakkt. NOTE: The SenderCompID and TargetCompID field values switch for messages that go from Bakkt to clients.

Standard Message Header

TagField NameTypeDefinitionOptional/Required
8BeginStringStringFor FIX 4.2 the must be the first field in the messageRequired
9BodyLengthIntMessage length (in bytes) and must be the second field in the message; Bakkt rejects messages that are more than 2048 bytes in lengthRequired
35MsgTypeStringThe type of FIX messageRequired
34MsgSeqNumIntThe session sequence number; starts at 1 every day following the maintenance windowRequired
49SenderCompIDStringThe Bakkt-provided session endpoint identifier bound to a specific legal entityRequired
52SendingTimeUtctimestampUTC/GMT with millisecond precisionRequired
56TargetCompIDStringMust always be the string AC for BakktRequired

Standard Message Trailer

TagField NameTypeDefinitionOptional/Required
10CheckSumIntThree-character integer of all characters in the message up to and including the delimiter preceding the CheckSum fieldRequired

Session Messages

Bakkt supports the following messages to establish, maintain, and terminate a client connection.

MessageDescription
LogonClients initiate a Logon with the Bakkt-provided username and password fields. Clients cannot reset sequence numbers as part of the Logon process. Heartbeats must be in the range of five to 60 seconds. Clients must logon with a MsgSeqNum of 1 following the maintenance window.
LogoutClients may initiate a Logout any time. Bakkt then acknowledges the initiation with a Logout of its own. Bakkt may issue a Logout followed by a disconnect in the following situations:
โ€“ Receiving a message (including a Logon) with a MsgSeqNum that is too low
โ€“ Failing to parse messages due to invalid BeginString, BodyLength, CheckSum or for bad data formatting, missing delimiters, or unsupported tag
โ€“ Invalid HeartBtInt, Password, or EncryptMethod during Logon
Heartbeat/TestRequestBakkt issues heartbeats (i.e., systematic connection tests) periodically during periods of inactivity to ensure connection integrity. Bakkt issues clients a TestRequest message if it does not receive an update within the heartbeat interval plus 100 milliseconds; it terminates the connection if it still does not receive a response within another heartbeat interval.
Session Level RejectBakkt issues a Session Level Reject when it receives a message, but the Application level cannot process it. The reasons for issuing a Session Level Reject include:
โ€“ Unexpected or invalid MsgType post Logon
โ€“ Missing required fields/tags.
Resend RequestBoth the client and Bakkt can issue this message as part of initialization or to recover lost messages mid-stream.
Sequence ResetBoth the client and Bakkt can issue this message as part of the message recovery process. Bakkt only supports GapFill sequence resets.

Logon

See the following definitions of Logon submitted by the client to Bakkt. If successful, Bakkt responds with a Logon acknowledgement with the password omitted. NOTE: The asterisk (*) indicates user-defined fields from FIX 4.4.

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = ARequired
98EncryptMethodIntMust always be 0; corresponds to "no encryption"Required
108HeartbeatIntIntMust be between five and 60 secondsRequired
*553UsernameStringBakkt-provided username for this session; required on Logon; submitted by the clientRequired
*554PasswordStringBakkt-provided password for this session; required on Logon; submitted by the clientRequired
Standard TrailerRequired

Logout

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 5Required
58TextStringFree form text for logoutOptional
Standard TrailerRequired

Heartbeat

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 0Required
112TestReqIDStringRequired if sending a heartbeat in response to a TestRequestRequired
Standard TrailerRequired

TestRequest

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 1Required
112TestReqIDStringIdentifier set by initiatorRequired
Standard TrailerRequired

ResendRequest

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 2Required
7BeginSeqNoIntSequence number of first message to recover; use this value in Tag 34 (MsgSeqNum) of the first resent messageRequired
16EndSeqNoIntSequence number of last message in the range to resend; use this value in Tag 34 (MsgSeqNum) of the last message; if the request is for a single message, then Tag 7 (BeginSeqNo) must equal Tag 16 (EndSeqNo)

For each resend request, the Bakkt system does not allow the client system to request more than 10,000 messages; in response to the resend request from the client system, Bakkt sends all messages for the requested range up to the last 10,000 messages
Required
Standard TrailerRequired

Sequence Reset

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 4Required
123GapFillFlagBooleanMust be โ€˜Yโ€™; Bakkt does not support sequence number resetsRequired
36NewSeqNoIntSequence number of next message to sendRequired
Standard TrailerRequired

Session Level Reject

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 3Required
45RefSeqNumIntThe sequence number of the received message that triggers the rejectionRequired
58TextStringA message explaining the rejection reasonOptional
371RefTagIDIntThe tag number of the problem field in the received message that triggers the rejectionOptional
372RefMsgTypeStringThe MsgType of the received message that triggers the rejectOptional
373SessionRejectReasonIntA code indicating the reason for the rejectionOptional
Standard TrailerRequired

Business Level Reject

The system rejects messages as Business Level Rejects when they are missing conditionally required fields.

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = jRequired
45RefSeqNumIntThe sequence number of received message that triggers the rejectionOptional
58TextStringA message explaining the reason for the rejectionOptional
372RefMsgTypeStringMsgType of the received message that triggers the rejectionRequired
380BusinessRejectReasonStringA code indicating the reason for the rejectionRequired
Standard TrailerRequired

Application Messages

The Bakkt system sends clients the following application message configurations for order execution sessions during the technical integration process.

MessageDescription
NewOrderSingleClients submit investor cryptocurrency and NFT orders via this message. Clients can submit orders on any tradeable symbol via a single session. The Bakkt system supports market and limit orders via this message.
Execution ReportThis message includes the order acknowledgement from the Bakkt system to the client along with any cancels, rejects, or order fills for clients' investors.
OrderCancelRequestClients submit order cancellations using this message.
OrderCancelRejectIf the Bakkt system does not accept an order, or if there are insufficient funds to reconcile a cryptocurrency purchase, this message contains the order cancellation details.

NewOrderSingle

Clients submit NewOrderSingle messages to Bakkt. The system allows clients to quote cryptocurrency orders in two ways:

  • Notional โ€“ Use Tag 152 in the CashOrderQty field (e.g., the customer buys $100 of BTCUSD by entering 100 for Tag 152 in the CashOrderQty field)
  • Absolute โ€“ Use Tag 38 in the OrderQty field (e.g., the customer sells .05 BTCUSD by entering .05 for Tag 38 in the OrderQty field)

NOTE: The asterisk (*) indicates a conditionally-required field.

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = DRequired
1AccountStringThe Bakkt client account identifier (e.g., ABC12345)Required
11ClOrdIDStringThe client-specified unique order identifier; The ClOrdID must not exceed 64 characters in lengthRequired
15CurrencyStringFor NFT sell orders, the currency of Price (must be the same as the NFT's native cryptocurrency); for NFT buy orders, the currency is implicitly USD, so do not specify this field*Optional
21HandlInstCharMust always be '1' (for automatic execution, private, and no broker)Required
55SymbolStringThe Bakkt-tradeable symbol identifierRequired
54SideCharThe market side of the order; acceptable values include '1' (for Buy) and '2' (for Sell)Required
44PriceFloatThis field is for the price (e.g., โ€œ23.0โ€=โ€23.0000โ€=โ€23โ€); all float fields must accommodate up to fifteen significant digitsRequired
38OrderQtyFloatThe order size in number of product units; Bakkt requires either OrderQty<3> or CashOrderQty<152>*Optional
40OrdTypeCharThe type of order (market or limit); acceptable values are:
1 (Market Order)
2 (Limit Order)
Required
59TimeInForceCharTime-in-Force is the life expectancy of an order; the platform currently supports the following:
0 (Day)
1 (Good til Cancel)
3 (Immediate or Cancel)
Required
60TransactTimeUtctimestampThe UTC/GMT time that the source system submits the order in millisecond precisionRequired
152CashOrderQtyFloatThe order size quoted as a notional cash quantity; Bakkt requires either OrderQty<3> or CashOrderQty<152>*Optional
Standard TrailerRequired

Order Cancel Request

This message requests the cancellation of an order.

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = FRequired
41OrigClOrdIDStringThe client-specified unique order identifierRequired
11ClOrdIDStringThe client-specified unique cancel request identifierRequired
37OrderIDStringThe Bakkt-generated order identifier returned in the acknowledgementRequired
55SymbolStringThe Bakkt-tradeable symbol identifier from NewOrderSingleRequired
54SideCharThe market side of original order per NewOrderSingle; acceptable values include '1' (for Buy) and '2' (for Sell)Required
60TransactTimeUtctimestampThe time the client generates the cancel requestRequired
Standard TrailerRequired

Order Cancel Reject

Bakkt may reject a cancel request by responding to the Order Cancel Request with an Order Cancel Reject message.

TagField NameTypeDefinitionOptional/Required
Standard HeaderMsgType = 9Required
41OrigClOrdIDStringThe ClOrdID of the order to cancelRequired
11ClOrdIDStringThe client-specified unique cancel request identifierRequired
37OrderIDStringThe Bakkt-generated order identifier returned in the acknowledgmentRequired
39OrdStatusCharThe current status of the orderRequired
58TextStringThis field offers text explaining the rejectionRequired
60TransactTimeUtctimestampThe time that Bakkt generates the rejection of the order cancellation requestRequired
Standard TrailerRequired