FIX API
[!NOTE] This API can only be used with the SPOT Exchange.
General Information
FIX connections require TLS encryption. Please either use native TCP+TLS connection or set up a local proxy such as stunnel to handle TLS encryption.
FIX sessions only support Ed25519 keys.
You can setup and configure your API key permissions on Spot Test Network.
FIX API order entry sessions
- Endpoint is:
tcp+tls://fix-oe.testnet.binance.vision:9000
- Supports placing orders, canceling orders, and querying current limit usage.
- Supports receiving all of the account's ExecutionReport
<8>
and List Status<N>
. - Only API keys with
FIX_API
are allowed to connect. - QuickFIX Schema can be found here.
FIX API Drop Copy sessions
- Endpoint is:
tcp+tls://fix-dc.testnet.binance.vision:9000
- Supports receiving all of the account's ExecutionReport
<8>
and List Status<N>
. - Only API keys with
FIX_API
orFIX_API_READ_ONLY
are allowed to connect. - QuickFIX Schema can be found here.
FIX Market Data sessions
- Endpoint is:
tcp+tls://fix-md.testnet.binance.vision:9000
- Supports market data streams and active instruments queries.
- Does not support placing or canceling orders.
- Only API keys with
FIX_API
orFIX_API_READ_ONLY
are allowed to connect. - QuickFIX Schema can be found here.
FIX Connection Lifecycle
- All FIX API sessions will remain open for as long as possible, on a best-effort basis.
- There is no minimum connection time guarantee; a server can enter maintenance at any time.
- When a server enters maintenance, a News
<B>
message will be sent to clients every 10 seconds for 10 minutes, prompting clients to reconnect. Upon receiving this message, a client is expected to establish a new session and close the old one. If the client does not close the old session within the time frame, the server will proceed to log it out and close the session.
- When a server enters maintenance, a News
- After connecting, the client must send a Logon
<A>
request. For more information please refer to How to sign a Logon request. - The client should send a Logout
<5>
message to close the session before disconnecting. Failure to send the logout message will result in the session’sSenderCompID (49)
being unusable for new session establishment for a duration of 2x theHeartInt (108)
interval. - The system allows negotiation of the
HeartInt (108)
value during the logon process. Accepted values range between 5 and 60 seconds.- If the server has not sent any messages within a
HeartInt (108)
interval, a HeartBeat<0>
will be sent. - If the server has not received any messages within a
HeartInt (108)
interval, a TestRequest<1>
will be sent. If the server does not receive a HeartBeat<0>
containing the expectedTestReqID (112)
from the client withinHeartInt (108)
seconds, the server will send a Logout<5>
message and close the connection. - If the client has not received any messages within a
HeartInt (108)
interval, the client is responsible for sending a TestRequest<1>
to ensure the connection is healthy. Upon receiving such a TestRequest<1>
, the server will respond with a Heartbeat<0>
containing the expectedTestReqID (112)
. If the client does not receive the server’s response within aHeartInt (108)
interval, the client should close the session and connection and establish new ones.
- If the server has not sent any messages within a
On message processing order
The MessageHandling (25035)
field required in the initial Logon<A>
message controls whether the
messages may get reordered before they are processed by the engine.
UNORDERED(1)
messages from client are allowed to be sent to the engine out of order.SEQUENTIAL(2)
messages from client are always sent to the engine in theMsgSeqNum (34)
order.
[!TIP]
UNORDERED(1)
should offer better performance when there are multiple messages in flight from the client to the server.
Response Mode
By default, all concurrent order entry sessions receive all of the account's
successful ExecutionReport<8>
and ListStatus<N>
messages,
including those in response to orders placed from other FIX sessions and via non-FIX APIs.
Use the ResponseMode (25036)
field in the initial Logon<A>
message
to change this behavior.
EVERYTHING(1)
: The default mode.ONLY_ACKS(2)
: Receive only ACK messages whether operation succeeded or failed. Disables ExecutionReport push.
How to sign Logon<A>
request
The Logon<A>
message authenticates your connection to the FIX API.
This must be the first message sent by the client.
- The
Username (553)
field is required to contain the API key. - The
RawData (96)
field is required to contain a valid signature made with the API key.
The signature payload is a text string constructed by concatenating the values of the following fields in this exact order, separated by the SOH character:
MsgType (35)
SenderCompId (49)
TargetCompId (56)
MsgSeqNum (34)
SendingTime (52)
Sign the payload using your private key.
Encode the signature with base64.
The resulting text string is the value of the RawData (96)
field.
Here is a sample Python code implementing the signature algorithm:
import base64
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives.serialization import load_pem_private_key
def logon_raw_data(private_key: Ed25519PrivateKey,
sender_comp_id: str,
target_comp_id: str,
msg_seq_num: str,
sending_time: str):
"""
Computes the value of RawData (96) field in Logon<A> message.
"""
payload = chr(1).join([
'A',
sender_comp_id,
target_comp_id,
msg_seq_num,
sending_time,
])
signature = private_key.sign(payload.encode('ASCII'))
return base64.b64encode(signature).decode('ASCII')
with open('private_key.pem', 'rb') as f:
private_key = load_pem_private_key(data=f.read(),
password=None)
raw_data = logon_raw_data(private_key,
sender_comp_id='5JQmUOsm',
target_comp_id='SPOT',
msg_seq_num='1',
sending_time='20240612-08:52:21.613')
The values presented below can be used to validate the correctness of the signature computation implementation:
Field | Value |
---|---|
MsgType (35) | A |
SenderCompID (49) | EXAMPLE |
TargetCompID (56) | SPOT |
MsgSeqNum (34) | 1 |
SendingTime (52) | 20240627-11:17:25.223 |
The Ed25519 private key used in the example computation is shown below:
[!CAUTION] The following secret key is provided solely for illustrative purposes. Do not use this key in any real-world application as it is not secure and may compromise your cryptographic implementation. Always generate your own unique and secure keys for actual use.
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIIJEYWtGBrhACmb9Dvy+qa8WEf0lQOl1s4CLIAB9m89u
-----END PRIVATE KEY-----
Computed signature:
4MHXelVVcpkdwuLbl6n73HQUXUf1dse2PCgT1DYqW9w8AVZ1RACFGM+5UdlGPrQHrgtS3CvsRURC1oj73j8gCA==
Resulting Logon <A>
message:
8=FIX.4.4|9=247|35=A|34=1|49=EXAMPLE|52=20240627-11:17:25.223|56=SPOT|95=88|96=4MHXelVVcpkdwuLbl6n73HQUXUf1dse2PCgT1DYqW9w8AVZ1RACFGM+5UdlGPrQHrgtS3CvsRURC1oj73j8gCA==|98=0|108=30|141=Y|553=sBRXrJx2DsOraMXOaUovEhgVRcjOvCtQwnWj8VxkOh1xqboS02SPGfKi2h8spZJb|25035=2|10=227|
Limits
Message Limits
- Each connection has a limit on how many messages can be sent to the exchange.
- The message limit does not count the messages sent in response to the client.
- Breaching the message limit results in immediate Logout
<5>
and disconnection. - To understand current limits and usage, please send a LimitQuery
<XLQ>
message. A LimitResponse<XLR>
message will be sent in response, containing information about Order Rate Limits and Message Limits. - FIX Order entry sessions have a limit of 10,000 messages every 10 seconds.
- FIX Drop Copy sessions have a limit of 60 messages every 60 seconds.
- FIX Market Data sessions have a limit of 2000 messages every 60 seconds.
Connection Limits
- Each Account has a limit on how many TCP connections can be established at the same time.
- The limit is reduced when the TCP connection is closed. If the reduction of connections is not immediate, please wait up to twice the value of
HeartBtInt (108)
for the change to take effect. For example, if the current value ofHeartBtInt
is 5, please wait up to 10 seconds. - Upon breaching the limit a Reject
<3>
will be sent containing information about the connection limit breach and the current limit. - The limit is 10 concurrent TCP connections per account for the Order Entry sessions. There is a limit of 15 connection attempts within 30 seconds.
- The limit is 10 concurrent TCP connections per account for the Drop Copy sessions. There is a limit of 15 connection attempts within 30 seconds.
- The limit is 100 concurrent TCP connections per account for Market Data sessions. There is a limit of 300 connection attempts within 300 seconds.
Unfilled Order Count
- To understand how many orders you have placed within a certain time interval, please send a LimitQuery
<XLQ>
message. A LimitResponse<XLR>
message will be sent in response, containing information about Unfilled Order Count and Message Limits. - Please note that if your orders are consistently filled by trades, you can continuously place orders on the API. For more information, please see Spot Unfilled Order Count Rules.
- If you exceed the unfilled order count your message will be rejected, and information will be transferred back to you in a reject message specific to that endpoint.
- The number of unfilled orders is tracked for each account.
Error Handling
Client messages that contain syntax errors, missing required fields, or refer to unknown symbols will be rejected by the server with a Reject <3>
message.
If a valid message cannot be processed and is rejected, an appropriate reject response will be sent. Please refer to the individual message documentation for possible responses.
Please refer to the Text (58)
and ErrorCode (25016)
fields in responses for the reject reason.
The list of error codes can be found on the Error codes page.
Types
Only printable ASCII characters and SOH are supported.
Type | Description |
---|---|
BOOLEAN | Enum: Y or N . |
CHAR | Single character. |
INT | Signed 64-bit integer. |
LENGTH | Unsigned 64-bit integer. |
NUMINGROUP | Unsigned 64-bit integer. |
PRICE | Fixed-point number. Precision depends on the symbol definition. |
QTY | Fixed-point number. Precision depends on the symbol definition. |
SEQNUM | Unsigned 32-bit integer. Rolls over to 0 after reaching its maximum value of 4,294,967,295. |
STRING | Sequence of printable ASCII characters. |
UTCTIMESTAMP | String representing datetime in UTC. |
Supported UTCTIMESTAMP
formats:
20011217-09:30:47
- seconds20011217-09:30:47.123
- milliseconds20011217-09:30:47.123456
- microseconds (always used in messages from the exchange)
Client order ID fields must conform to the regex ^[a-zA-Z0-9-_]{1,36}$
:
ClOrdID (11)
OrigClOrdID (41)
MDReqID (262)
ClListID (25014)
OrigClListID (25015)
CancelClOrdID (25034)
Message Components
[!NOTE] In example messages, the
|
character is used to represent SOH character:
8=FIX.4.4|9=113|35=A|34=1|49=SPOT|52=20240612-08:52:21.636837|56=5JQmUOsm|98=0|108=30|25037=4392a152-3481-4499-921a-6d42c50702e2|10=051|
Header
Appears at the start of every message.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
8 | BeginString | STRING | Y | Always FIX.4.4 . Must be the first field the message. |
9 | BodyLength | LENGTH | Y | Message length in bytes. Must be the second field in the message. |
35 | MsgType | STRING | Y | Must be the third field in the message. Possible values: 0 - HEARTBEAT 1 - TEST_REQUEST 3 - REJECT 5 - LOGOUT 8 - EXECUTION_REPORT 9 - ORDER_CANCEL_REJECT A - LOGON D - NEW_ORDER_SINGLE E - NEW_ORDER_LIST F - ORDER_CANCEL_REQUEST N - LIST_STATUS q - ORDER_MASS_CANCEL_REQUEST r - ORDER_MASS_CANCEL_REPORT XCN - ORDER_CANCEL_REQUEST_AND_NEW_ORDER_SINGLE XLQ - LIMIT_QUERY XLR - LIMIT_RESPONSE B - NEWS x - INSTRUMENT_LIST_REQUEST y - INSTRUMENT_LIST V - MARKET_DATA_REQUEST Y - MARKET_DATA_REQUEST_REJECT W - MARKET_DATA_SNAPSHOT X - MARKET_DATA_INCREMENTAL_REFRESH XAK - ORDER_AMEND_KEEP_PRIORITY_REQUEST XAR - ORDER_AMEND_REJECT |
49 | SenderCompID | STRING | Y | Must be unique across an account's active sessions. Must obey regex: ^[a-zA-Z0-9-_]{1,8}$ |
56 | TargetCompID | STRING | Y | A string identifying this TCP connection. On messages from client required to be set to SPOT . Must be unique across TCP connections. Must conform to the regex: ^[a-zA-Z0-9-_]{1,8}$ |
34 | MsgSeqNum | SEQNUM | Y | Integer message sequence number. Values that will cause a gap will be rejected. |
52 | SendingTime | UTCTIMESTAMP | Y | Time of message transmission (always expressed in UTC). |
25000 | RecvWindow | INT | N | Number of milliseconds after SendingTime (52) the request is valid for. Defaults to 5000 milliseconds in Logon<A> and has a max value of 60000 milliseconds. |
Trailer
Appears at the end of every message.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
10 | CheckSum | STRING | Y | Always three-character numeric string, calculated by summing the ASCII values of each preceding character in the message, including start-of-header (SOH) characters. The resultant sum is divided by 256, with the remainder forming the CheckSum value. To maintain a fixed length, the CheckSum field is right-justified and zero-padded as needed. |
Administrative Messages
Heartbeat<0>
Sent by the server if there is no outgoing traffic during the heartbeat interval (HeartBtInt (108)
in Logon<A>
).
Sent by the client to indicate that the session is healthy.
Sent by the client or the server in response to a TestRequest<1>
message.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
112 | TestReqID | STRING | N | When Heartbeat<35> is sent in response to TestRequest<1> , must mirror the value in TestRequest<1> . |
TestRequest<1>
Sent by the server if there is no incoming traffic during the heartbeat interval (HeartBtInt (108)
in Logon<A>
).
Sent by the client to request a Heartbeat<0>
response.
[!NOTE] If the client does not respond to TestRequest
<1>
with Heartbeat<0>
with a correctTestReqID (112)
within timeout, the connection will be dropped.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
112 | TestReqID | STRING | Y | Arbitrary string that must be included in the Heartbeat<0> response. |
Reject<3>
Sent by the server in response to an invalid message that cannot be processed.
Sent by the server if a new connection cannot be accepted. Please refer to Connection Limits.
Please refer to the Text (58)
and ErrorCode (25016)
fields for the reject reason.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
45 | RefSeqNum | INT | N | The MsgSeqNum (34) of the rejected message that caused issuance of this Reject<3> . |
371 | RefTagID | INT | N | When present, identifies the field that directly caused the issuance of this Reject<3> message. |
372 | RefMsgType | STRING | N | The MsgType (35) of the rejected message that caused issuance of this Reject<3> . |
373 | SessionRejectReason | INT | N | A reason for the reject, can be one of the values below. Usually accompanied by additional Text description Possible values: 0 - INVALID_TAG_NUMBER 1 - REQUIRED_TAG_MISSING 2 - TAG_NOT_DEFINED_FOR_THIS_MESSAGE_TYPE 3 - UNDEFINED_TAG 5 - VALUE_IS_INCORRECT 6 - INCORRECT_DATA_FORMAT_FOR_VALUE 8 - SIGNATURE_PROBLEM 10 - SENDINGTIME_ACCURACY_PROBLEM 12 - XML_VALIDATION_ERROR 13 - TAG_APPEARS_MORE_THAN_ONCE 14 - TAG_SPECIFIED_OUT_OF_REQUIRED_ORDER 15 - REPEATING_GROUP_FIELDS_OUT_OF_ORDER 16 - INCORRECT_NUMINGROUP_COUNT_FOR_REPEATING_GROUP99 - OTHER |
25016 | ErrorCode | INT | N | API error code (see Error Codes). |
58 | Text | STRING | N | Human-readable error message. |
Logon<A>
Sent by the client to authenticate the connection.
Logon<A>
must be the first message sent by the client.
Sent by the server in response to a successful logon.
[!NOTE] Logon
<A>
can only be sent once for the entirety of the session.
Logon Request
Tag | Name | Type | Required | Description |
---|---|---|---|---|
98 | EncryptMethod | INT | Y | Required to be 0 . |
108 | HeartBtInt | INT | Y | Required to be within range [5, 60]. Heartbeat interval in seconds. |
95 | RawDataLength | LENGTH | Y | Length of the RawData (96) field that comes strictly after this field. |
96 | RawData | DATA | Y | Signature. How to sign Logon<A> request. |
141 | ResetSeqNumFlag | BOOLEAN | Y | Required to be Y . |
553 | Username | STRING | Y | API key. Only Ed25519 API keys are supported. |
25035 | MessageHandling | INT | Y | Possible values: 1 - UNORDERED 2 - SEQUENTIAL Please refer to On message order processing for more information. |
25036 | ResponseMode | INT | N | Please refer to Response Mode. |
9406 | DropCopyFlag | BOOLEAN | N | Must be set to 'Y' when logging into Drop Copy sessions. |
Sample message:
8=FIX.4.4|9=248|35=A|34=1|49=5JQmUOsm|52=20240612-08:52:21.613|56=SPOT|95=88|96=KhJLbZqADWknfTAcp0ZjyNz36Kxa4ffvpNf9nTIc+K5l35h+vA1vzDRvLAEQckyl6VDOwJ53NOBnmmRYxQvQBQ==|98=0|108=30|141=Y|553=W5rcOD30c0gT4jHK8oX5d5NbzWoa0k4SFVoTHIFNJVZ3NuRpYb6ZyJznj8THyx5d|25035=1|10=000|
Logon Response
Tag | Name | Type | Required | Description |
---|---|---|---|---|
98 | EncryptMethod | INT | Y | Always 0 . |
108 | HeartBtInt | INT | Y | Mirrors value from the Logon request. |
25037 | UUID | STRING | Y | UUID of the FIX API serving the requests. |
Sample message:
8=FIX.4.4|9=113|35=A|34=1|49=SPOT|52=20240612-08:52:21.636837|56=5JQmUOsm|98=0|108=30|25037=4392a152-3481-4499-921a-6d42c50702e2|10=051|
Logout<5>
Sent to initiate the process of closing the connection, and also when responding to Logout.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
58 | Text | STRING | N |
Sample messages:
Logout Request
8=FIX.4.4|9=55|35=5|34=3|49=GhQHzrLR|52=20240611-09:44:25.543|56=SPOT|10=249|
Logout Response
8=FIX.4.4|9=84|35=5|34=4|49=SPOT|52=20240611-09:44:25.544001|56=GhQHzrLR|58=Logout acknowledgment.|10=212|
News <B>
When the server enters maintenance, a News
message will be sent to clients every 10 seconds for 10 minutes.
After this period, clients will be logged out and their sessions will be closed.
Upon receiving this message, clients are expected to establish a new session and close the old one.
The countdown message sent will be:
You'll be disconnected in %d seconds. Please reconnect.
When there are 10 seconds remaining, the following message will be sent:
Your connection is about to be closed. Please reconnect.
If the client does not close the old session within 10 seconds of receiving the above message, the server will log it out and close the session.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
148 | Headline | STRING | Y |
Sample message:
8=FIX.4.4|9=0000113|35=B|49=SPOT|56=OE|34=4|52=20240924-21:07:35.773537|148=Your connection is about to be closed. Please reconnect.|10=165|
Resend Request <2>
Resend requests are currently not supported.
Application Messages
Order Entry Messages
[!NOTE] The messages below can only be used for the FIX Order Entry and FIX Drop Copy Sessions.
NewOrderSingle<D>
Sent by the client to submit a new order for execution.
Please refer to Supported Order Types for supported field combinations.
[!NOTE] Many fields become required based on the order type. Please refer to Supported Order Types.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrdID | STRING | Y | ClOrdID to be assigned to the order. |
38 | OrderQty | QTY | N | Quantity of the order |
40 | OrdType | CHAR | Y | See the table to understand supported order types and the required fields to use them. Possible values: 1 - MARKET 2 - LIMIT 3 - STOP 4 - STOP_LIMIT |
18 | ExecInst | CHAR | N | Possible values: 6 - PARTICIPATE_DONT_INITIATE |
44 | Price | PRICE | N | Price of the order |
54 | Side | CHAR | Y | Side of the order. Possible values: 1 - BUY 2 - SELL |
55 | Symbol | STRING | Y | Symbol to place the order on. |
59 | TimeInForce | CHAR | N | Possible values: 1 - GOOD_TILL_CANCEL 3 - IMMEDIATE_OR_CANCEL 4 - FILL_OR_KILL |
111 | MaxFloor | QTY | N | Used for iceberg orders, this specifies the visible quantity of the order on the book. |
152 | CashOrderQty | QTY | N | Quantity of the order specified in the quote asset units, for reverse market orders. |
847 | TargetStrategy | INT | N | The value cannot be less than 1000000 . |
7940 | StrategyID | INT | N | |
25001 | SelfTradePreventionMode | CHAR | N | Possible values: 1 - NONE 2 - EXPIRE_TAKER 3 - EXPIRE_MAKER 4 - EXPIRE_BOTH 5 - DECREMENT |
1100 | TriggerType | CHAR | N | Possible values: 4 - PRICE_MOVEMENT |
1101 | TriggerAction | CHAR | N | Possible values: 1 - ACTIVATE |
1102 | TriggerPrice | PRICE | N | Activation price for contingent orders. See table |
1107 | TriggerPriceType | CHAR | N | Possible values: 2 - LAST_TRADE |
1109 | TriggerPriceDirection | CHAR | N | Used to differentiate between StopLoss and TakeProfit orders. See table. Possible values: U - TRIGGER_IF_THE_PRICE_OF_THE_SPECIFIED_TYPE_GOES_UP_TO_OR_THROUGH_THE_SPECIFIED_TRIGGER_PRICE D - TRIGGER_IF_THE_PRICE_OF_THE_SPECIFIED_TYPE_GOES_DOWN_TO_OR_THROUGH_THE_SPECIFIED_TRIGGER_PRICE |
25009 | TriggerTrailingDeltaBips | INT | N | Provide to create trailing orders. |
25032 | SOR | BOOLEAN | N | Whether to activate SOR for this order. |
Sample message:
8=FIX.4.4|9=114|35=D|34=2|49=qNXO12fH|52=20240611-09:01:46.228|56=SPOT|11=1718096506197867067|38=5|40=2|44=10|54=1|55=LTCBNB|59=4|10=016|
Response:
- ExecutionReport
<8>
withExecType (150)
valueNEW (0)
if the order was accepted. - ExecutionReport
<8>
withExecType (150)
valueREJECTED (8)
if the order was rejected. - Reject
<3>
if the message is rejected.
Supported Order Types
Order name | Binance OrderType | Side | required field values | required fields with user values |
---|---|---|---|---|
Market order | MARKET | BUY or SELL | 40=1| | |
Limit order | LIMIT | BUY or SELL | 40=2| | |
Limit maker order | LIMIT_MAKER | BUY or SELL | 40=2|18=6| | |
Buy stop loss order | STOP_LOSS | BUY | 40=3|1100=4|1101=1|1107=2|1109=U| | 1102 |
Buy trailing stop loss order | STOP_LOSS | BUY | 40=3|1100=4|1101=1|1107=2|1109=U| | 1102,25009 |
Buy stop loss limit order | STOP_LOSS_LIMIT | BUY | 40=4|1100=4|1101=1|1107=2|1109=U| | 1102 |
Buy trailing stop loss limit order | STOP_LOSS_LIMIT | BUY | 40=4|1100=4|1101=1|1107=2|1109=U| | 1102,25009 |
Sell stop loss order | STOP_LOSS | SELL | 40=3|1100=4|1101=1|1107=2|1109=D| | 1102 |
Sell trailing stop loss order | STOP_LOSS | SELL | 40=3|1100=4|1101=1|1107=2|1109=D| | 1102,25009 |
Sell stop loss limit order | STOP_LOSS_LIMIT | SELL | 40=4|1100=4|1101=1|1107=2|1109=D| | 1102 |
Sell trailing stop loss limit order | STOP_LOSS_LIMIT | SELL | 40=4|1100=4|1101=1|1107=2|1109=D| | 1102,25009 |
Buy take profit order | TAKE_PROFIT | BUY | 40=3|1100=4|1101=1|1107=2|1109=D| | 1102 |
Buy trailing take profit order | TAKE_PROFIT | BUY | 40=3|1100=4|1101=1|1107=2|1109=D| | 1102,25009 |
Buy trailing take profit order | TAKE_PROFIT | BUY | 40=3|1100=4|1101=1|1107=2| | 25009 |
Buy take profit order | TAKE_PROFIT_LIMIT | BUY | 40=4|1100=4|1101=1|1107=2|1109=D| | 1102 |
Buy trailing take profit limit order | TAKE_PROFIT_LIMIT | BUY | 40=4|1100=4|1101=1|1107=2|1109=D| | 1102,25009 |
Buy trailing take profit limit order | TAKE_PROFIT_LIMIT | BUY | 40=4|1100=4|1101=1|1107=2| | 25009 |
Sell take profit order | TAKE_PROFIT | SELL | 40=3|1100=4|1101=1|1107=2|1109=U| | 1102 |
Sell trailing take profit order | TAKE_PROFIT | SELL | 40=3|1100=4|1101=1|1107=2|1109=U| | 1102,25009 |
Sell trailing take profit order | TAKE_PROFIT | SELL | 40=3|1100=4|1101=1|1107=2| | 25009 |
Sell take profit limit order | TAKE_PROFIT_LIMIT | SELL | 40=4|1100=4|1101=1|1107=2|1109=U| | 1102 |
Sell trailing take profit limit order | TAKE_PROFIT_LIMIT | SELL | 40=4|1100=4|1101=1|1107=2|1109=U| | 1102,25009 |
Sell trailing take profit limit order | TAKE_PROFIT_LIMIT | SELL | 40=4|1100=4|1101=1|1107=2| | 25009 |
Required fields based on Binance OrderType:
Binance OrderType | Additional mandatory parameters | Additional Information |
---|---|---|
LIMIT | 38, 44, 59 | |
MARKET | 38 OR 152 | MARKET orders using the OrderQty (38) field specifies the amount of the base asset the user wants to buy or sell at the market price. E.g. MARKET order on BTCUSDT will specify how much BTC the user is buying or selling. MARKET orders using quoteOrderQty specifies the amount the user wants to spend (when buying) or receive (when selling) the quote asset; the correct quantity will be determined based on the market liquidity and quoteOrderQty . E.g. Using the symbol BTCUSDT: BUY side, the order will buy as many BTC as quoteOrderQty USDT can. SELL side, the order will sell as much BTC needed to receive CashOrderQty (152) USDT. |
STOP_LOSS | 38, 1102 or 25009 | This will execute a MARKET order when the conditions are met. (e.g. TriggerPrice (1102) is met or TriggerTrailingDeltaBips (25009) is activated) |
STOP_LOSS_LIMIT | 38, 44, 59, 1102 or 25009 | |
TAKE_PROFIT | 38, 1102 or 25009 | This will execute a MARKET order when the conditions are met. (e.g. TriggerPrice (1102) is met or TriggerTrailingDeltaBips (25009) is activated) |
TAKE_PROFIT_LIMIT | 38, 44, 59, 1102 or 25009 | |
LIMIT_MAKER | 38, 44 | This is a LIMIT order that will be rejected if the order immediately matches and trades as a taker. This is also known as a POST-ONLY order. |
ExecutionReport<8>
Sent by the server whenever an order state changes.
[!NOTE]
- By default, ExecutionReport
<8>
is sent for all orders of an account, including those submitted in different connections. Please see Response Mode for other behavior options.- FIX API should give better performance for ExecutionReport
<8>
push.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
17 | ExecID | STRING | N | Omitted on rejected orders. |
11 | ClOrdID | STRING | N | ClOrdID of the list as assigned on the request. |
41 | OrigClOrdID | STRING | N | Original ClOrdID of the order. |
37 | OrderID | INT | N | Assigned by exchange. |
38 | OrderQty | QTY | N | Quantity of the order. |
40 | OrdType | CHAR | Y | Possible values: 1 - MARKET 2 - LIMIT 3 - STOP_LOSS 4 - STOP_LIMIT |
54 | Side | CHAR | Y | Possible values: 1 - BUY 2 - SELL |
55 | Symbol | STRING | Y | Symbol of the order. |
18 | ExecInst | CHAR | N | Possible values: 6 - PARTICIPATE_DONT_INITIATE |
44 | Price | PRICE | N | Price of the order. |
59 | TimeInForce | CHAR | N | Possible values: 1 - GOOD_TILL_CANCEL 3 - IMMEDIATE_OR_CANCEL 4 - FILL_OR_KILL |
60 | TransactTime | UTCTIMESTAMP | N | Timestamp when this event occurred. |
25018 | OrderCreationTime | INT | N | |
111 | MaxFloor | QTY | N | Appears on iceberg orders. |
66 | ListID | STRING | N | Appears on list orders. |
152 | CashOrderQty | QTY | N | OrderQty specified in the quote asset units. |
847 | TargetStrategy | INT | N | TargetStrategy (847) from the order placement request. |
7940 | StrategyID | INT | N | StrategyID (7940) from the order placement request. |
25001 | SelfTradePreventionMode | CHAR | N | Possible values: 1 - NONE 2 - EXPIRE_TAKER 3 - EXPIRE_MAKER 4 - EXPIRE_BOTH 5 - DECREMENT |
150 | ExecType | CHAR | Y | Note: Field PreventedMatchID(25024) will be present if order has expired due to SelfTradePreventionMode(25013) Possible values: 0 - NEW 4 - CANCELED 5 - REPLACED 8 - REJECTED F - TRADE C - EXPIRED |
14 | CumQty | QTY | Y | Total number of base asset traded on this order. |
151 | LeavesQty | QTY | N | Quantity remaining for further execution. |
25017 | CumQuoteQty | QTY | N | Total number of quote asset traded on this order. |
1057 | AggressorIndicator | BOOLEAN | N | Appears on trade execution reports. Indicates whether the order was a taker in the trade. |
1003 | TradeID | STRING | N | Appears on trade execution reports. |
31 | LastPx | PRICE | N | The price of the last execution. |
32 | LastQty | QTY | Y | The quantity of the last execution. |
39 | OrdStatus | CHAR | Y | Possible values: 0 - NEW 1 - PARTIALLY_FILLED 2 - FILLED 4 - CANCELED 6 - PENDING_CANCEL8 - REJECTED A - PENDING_NEW C - EXPIRED Note that FIX does not support EXPIRED_IN_MATCH status, and get converted to EXPIRED in FIX. |
70 | AllocID | INT | N | Allocation ID as assigned by the exchange. |
574 | MatchType | INT | N | Possible values:1 - ONE_PARTY_TRADE_REPORT4 - AUTO_MATCH |
25021 | WorkingFloor | INT | N | Appears for orders that potentially have allocations. |
25022 | TrailingTime | UTCTIMESTAMP | N | Appears only for trailing stop orders. |
636 | WorkingIndicator | BOOLEAN | N | Set to Y when this order enters order book. |
25023 | WorkingTime | UTCTIMESTAMP | N | When this order appeared on the order book. |
25024 | PreventedMatchID | INT | N | Appears only for orders that expired due to STP. |
25025 | PreventedExecutionPrice | PRICE | N | Appears only for orders that expired due to STP. |
25026 | PreventedExecutionQty | QTY | N | Appears only for orders that expired due to STP. |
25027 | TradeGroupID | INT | N | Appears only for orders that expired due to STP. |
25028 | CounterSymbol | STRING | N | Appears only for orders that expired due to STP. |
25029 | CounterOrderID | INT | N | Appears only for orders that expired due to STP. |
25030 | PreventedQty | QTY | N | Appears only for orders that expired due to STP. |
25031 | LastPreventedQty | QTY | N | Appears only for orders that expired due to STP. |
25032 | SOR | BOOLEAN | N | Appears for orders that used SOR. |
25016 | ErrorCode | INT | N | API error code (see Error Codes). |
58 | Text | STRING | N | Human-readable error message. |
136 | NoMiscFees | NUMINGROUP | N | Number of repeating groups of miscellaneous fees. |
=>137 | MiscFeeAmt | QTY | Y | Amount of fees denominated in MiscFeeCurr(138) asset |
=>138 | MiscFeeCurr | STRING | Y | Currency of miscellaneous fee. |
=>139 | MiscFeeType | INT | Y | Possible values: 4 - EXCHANGE_FEES |
1100 | TriggerType | CHAR | N | Possible values: 4 - PRICE_MOVEMENT |
1101 | TriggerAction | CHAR | N | Possible values: 1 - ACTIVATE |
1102 | TriggerPrice | PRICE | N | Activation price for contingent orders. See table |
1107 | TriggerPriceType | CHAR | N | Possible values: 2 - LAST_TRADE |
1109 | TriggerPriceDirection | CHAR | N | Used to differentiate between StopLoss and TakeProfit orders. See table. Possible values: U - TRIGGER_IF_THE_PRICE_OF_THE_SPECIFIED_TYPE_GOES_UP_TO_OR_THROUGH_THE_SPECIFIED_TRIGGER_PRICE D - TRIGGER_IF_THE_PRICE_OF_THE_SPECIFIED_TYPE_GOES_DOWN_TO_OR_THROUGH_THE_SPECIFIED_TRIGGER_PRICE |
25009 | TriggerTrailingDeltaBips | INT | N | Appears only for trailing stop orders. |
Sample message:
8=FIX.4.4|9=330|35=8|34=2|49=SPOT|52=20240611-09:01:46.228950|56=qNXO12fH|11=1718096506197867067|14=0.00000000|17=144|32=0.00000000|37=76|38=5.00000000|39=0|40=2|44=10.00000000|54=1|55=LTCBNB|59=4|60=20240611-09:01:46.228000|150=0|151=5.00000000|636=Y|1057=Y|25001=1|25017=0.00000000|25018=20240611-09:01:46.228000|25023=20240611-09:01:46.228000|10=095|
OrderCancelRequest<F>
Sent by the client to cancel an order or an order list.
- To cancel an order either
OrderID (11)
orOrigClOrdID (41)
are required.- If both
OrderID (37)
andOrigClOrdID (41)
are provided, theOrderID
is searched first, then theOrigClOrdID
from that result is checked against that order. If both conditions are not met the request will be rejected.
- If both
- To cancel an order list either
ListID (66)
orOrigClListID (25015)
are required.- If both
ListID (66)
andOrigClListID (25015)
are provided, theListID
is searched first, then theOrigClListID
from that result is checked against that order. If both conditions are not met the request will be rejected.
- If both
If the canceled order is part of an order list, the entire list will be canceled.
Note:
The performance for canceling an order (single cancel or as part of a cancel-replace) is always better when only orderId
is sent. Sending origClientOrderId
or both orderId
+ origClientOrderId
will be slower.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrdID | STRING | Y | ClOrdID of this request. |
41 | OrigClOrdID | STRING | N | ClOrdID (11) of the order to cancel. |
37 | OrderID | INT | N | OrderID (37) of the order to cancel. |
25015 | OrigClListID | STRING | N | ClListID (25014) of the order list to cancel. |
66 | ListID | STRING | N | ListID (66) of the order list to cancel. |
55 | Symbol | STRING | Y | Symbol on which to cancel order. |
25002 | CancelRestrictions | INT | N | Restrictions on the cancel. Possible values: 1 - ONLY_NEW 2 - ONLY_PARTIALLY_FILLED |
Sample message:
8=FIX.4.4|9=93|35=F|34=2|49=ieBwvCKy|52=20240613-01:11:13.784|56=SPOT|11=1718241073695674483|37=2|55=LTCBNB|10=210|
Response:
- ExecutionReport
<8>
withExecType (150)
valueCANCELED (4)
for each canceled order. - ListStatus
<N>
if orders in an order list were canceled. - OrderCancelReject
<9>
if cancellation was rejected. - Reject
<3>
if the message is rejected.
OrderCancelReject<9>
Sent by the server when OrderCancelRequest<F>
has failed.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrdID | STRING | Y | ClOrdID (11) of the cancel request. |
41 | OrigClOrdID | STRING | N | OrigClOrdID (41) from the cancel request. |
37 | OrderID | INT | N | OrderID (37) from the cancel request. |
25015 | OrigClListID | STRING | N | OrigClListID (25015) from the cancel request. |
66 | ListID | STRING | N | ListID (66) from the cancel request. |
55 | Symbol | STRING | Y | Symbol (55) from the cancel request. |
25002 | CancelRestrictions | INT | N | CancelRestrictions (25002) from the cancel request. |
434 | CxlRejResponseTo | CHAR | Y | Type of request that this OrderCancelReject<9> is in response to. Possible values: 1 - ORDER_CANCEL_REQUEST |
25016 | ErrorCode | INT | Y | API error code (see Error Codes). |
58 | Text | STRING | Y | Human-readable error message. |
Sample message:
8=FIX.4.4|9=137|35=9|34=2|49=SPOT|52=20240613-01:12:41.320869|56=OlZb8ht8|11=1718241161272843932|37=2|55=LTCBNB|58=Unknown order sent.|434=1|25016=-1013|10=087|
OrderCancelRequestAndNewOrderSingle<XCN>
Sent by the client to cancel an order and submit a new one for execution.
- To cancel an order either
OrderID (11)
orOrigClOrdId (41)
are required. - If both
OrderID (37)
andOrigClOrdID (41)
are provided, theOrderID
is searched first, then theOrigClOrdID
from that result is checked against that order. If both conditions are not met the request will be rejected.
Please refer to Supported Order Types for supported field combinations when describing the new order.
[!NOTE] Cancel is always processed first. Then immediately after that the new order is submitted.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
25033 | OrderCancelRequestAndNewOrderSingleMode | INT | Y | What action should be taken if cancel fails. Possible values: 1 - STOP_ON_FAILURE 2 - ALLOW_FAILURE |
25038 | OrderRateLimitExceededMode | INT | N | What should be done to the cancellation request if you exceed the unfilled order rate limit. Possible values: 1 - DO_NOTHING 2 - CANCEL_ONLY |
37 | OrderID | INT | N | OrderID of the order to cancel. |
25034 | CancelClOrdID | STRING | N | ClOrdID of the cancel. |
41 | OrigClOrdID | STRING | N | ClOrdID of the order to cancel. |
11 | ClOrdID | STRING | Y | ClOrdID to be assigned to the new order. |
25002 | CancelRestrictions | INT | N | Restrictions on the cancel. Possible values: 1 - ONLY_NEW 2 - ONLY_PARTIALLY_FILLED |
38 | OrderQty | QTY | N | Quantity of the new order |
40 | OrdType | CHAR | Y | See the table to understand supported order types and the required fields to use them. Possible values: 1 - MARKET 2 - LIMIT 3 - STOP 4 - STOP_LIMIT |
18 | ExecInst | CHAR | N | Possible values: 6 - PARTICIPATE_DONT_INITIATE |
44 | Price | PRICE | N | Price of the new order |
54 | Side | CHAR | Y | Side of the order. Possible values: 1 - BUY 2 - SELL |
55 | Symbol | STRING | Y | Symbol to cancel and place the order on. |
59 | TimeInForce | CHAR | N | Possible values: 1 - GOOD_TILL_CANCEL 3 - IMMEDIATE_OR_CANCEL 4 - FILL_OR_KILL |
111 | MaxFloor | QTY | N | Used for iceberg orders, this specifies the visible quantity of the order on the book. |
152 | CashOrderQty | QTY | N | Quantity of the order specified in the quote asset units, for reverse market orders. |
847 | TargetStrategy | INT | N | The value cannot be less than 1000000 . |
7940 | StrategyID | INT | N | |
25001 | SelfTradePreventionMode | CHAR | N | Possible values: 1 - NONE 2 - EXPIRE_TAKER 3 - EXPIRE_MAKER 4 - EXPIRE_BOTH 5 - DECREMENT |
1100 | TriggerType | CHAR | N | Possible values: 4 - PRICE_MOVEMENT |
1101 | TriggerAction | CHAR | N | Possible values: 1 - ACTIVATE |
1102 | TriggerPrice | PRICE | N | Activation price for contingent orders. See table |
1107 | TriggerPriceType | CHAR | N | Possible values: 2 - LAST_TRADE |
1109 | TriggerPriceDirection | CHAR | N | Used to differentiate between StopLoss and TakeProfit orders. See table. Possible values: U - TRIGGER_IF_THE_PRICE_OF_THE_SPECIFIED_TYPE_GOES_UP_TO_OR_THROUGH_THE_SPECIFIED_TRIGGER_PRICE D - TRIGGER_IF_THE_PRICE_OF_THE_SPECIFIED_TYPE_GOES_DOWN_TO_OR_THROUGH_THE_SPECIFIED_TRIGGER_PRICE |
25009 | TriggerTrailingDeltaBips | INT | N | Provide to create trailing orders. |
Sample message:
8=FIX.4.4|9=160|35=XCN|34=2|49=JS8iiXK6|52=20240613-02:31:53.753|56=SPOT|11=1718245913721036458|37=8|38=5|40=2|44=4|54=1|55=LTCBNB|59=1|111=1|25033=1|25034=1718245913721036819|10=229|
Response:
- ExecutionReport
<8>
withExecType (150)
valueCANCELED (4)
for the canceled order. - ExecutionReport
<8>
withExecType (150)
valueNEW (0)
for the new order. - ExecutionReport
<8>
withExecType (150)
valueREJECTED (8)
if the new order was rejected. - OrderCancelReject
<9>
if the cancellation was rejected. - Reject
<3>
if the message is rejected.
OrderMassCancelRequest<q>
Sent by the client to cancel all open orders on a symbol.
[!NOTE] All orders of the account will be canceled, including those placed in different connections.
Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrdID | STRING | Y | ClOrdId of this mass cancel request. |
55 | Symbol | STRING | Y | Symbol on which to cancel orders. |
530 | MassCancelRequestType | CHAR | Y | Possible values: 1 - CANCEL_SYMBOL_ORDERS |
Sample message:
8=FIX.4.4|9=95|35=q|34=2|49=dpYPesqv|52=20240613-01:24:36.948|56=SPOT|11=1718241876901971671|55=BTCUSDT|530=1|10=243|
Responses:
- ExecutionReport
<8>
withExecType (150)
valueCANCELED (4)
for the every order canceled. - OrderMassCancelReport
<r>
withMassCancelResponse (531)
field indicating whether the message is accepted or rejected. - Reject
<3>
if the message is rejected.