Webull Public FIX Interface
v1.9
Copyright
This document is the copyrighted work of Webull. Webull distributes this document pursuant to a subscription agreement containing confidentiality and license provisions and is solely for the benefit of its authorized licensees. This documentation may not be copied or transmitted, in whole or in part, in any form or by any means without the express written consent of Webull.
Content
Information in this document is subject to change without notice. In the event that you are using a version of Webull products other than the most recent version, there may be discrepancies between the content of this documentation and the operation or visual presentation of your older version of the product. Webull does not warrant that this documentation is error-free.
Trademarks
Webull is a registered trademark. All Webull company and product names are trademarks of Webull. All other company or product names mentioned herein are the trademarks or registered trademarks of their respective companies.
1. Introduction
The Webull Public FIX Interface has been developed on the universally adopted standard FIX protocol, offering clients standardized protocol access to the Webull global trading network.
This document is designed to furnish clients with the specifications needed for integrating with Webull through the FIX protocol.
Please note that this document does not include guidance on implementing the FIX engine. It is recommended that readers have a preliminary understanding of the FIX protocol before proceeding.
2. Supported FIX Version
This specification is developed based on FIX 4.2. Building on this, it also introduces some higher-version tags and values to support special types of orders. Customers can connect via the following FIX versions:
- FIX.4.2
3. Standard Message Header
| Field | Name | Req'd | Description |
|---|---|---|---|
| 9 | BodyLength | Y | Must be the second field in message. |
| 34 | MsgSeqNum | Y | |
| 35 | MsgType | Y | Must be the third field in message. Please refer to the sections "Session Level Messages" and "Application Level Messages" for the MsgType<35> supported. |
| 43 | PossDupFlag | N | Always required for retransmitted messages, whether prompted by the sending system or as the result of a resend request. |
| 49 | SenderCompID | Y | |
| 50 | SenderSubID | N | Identify specific message originator. |
| 52 | SendingTime | Y | Time/date combination represented in UTC (Universal Time Coordinated, also known as "GMT") in either YYYYMMDD-HH:MM:SS (whole seconds) or YYYYMMDD-HH:MM:SS.sss (milliseconds) format, colons, dash, and period required. |
| 56 | TargetCompID | Y | |
| 115 | OnBehalfOfCompID | N | Trading partner company ID used when sending messages via a third party. |
| 122 | OrigSendingTime | N | Required for message resent as a result of a ResendRequest. |
| 128 | DeliverToCompID | N | Trading partner company ID used when sending messages via a third party. |
4. Standard Message Trailer
| Field | Name | Req'd | Description |
|---|---|---|---|
| 10 | CheckSum | Y |
5. Session Level Messages
The following session level messages are supported:
| Name | MsgType | Incoming | Outgoing |
|---|---|---|---|
| Logon | A | ✓ | ✓ |
| Heartbeat | 0 | ✓ | ✓ |
| TestRequest | 1 | ✓ | ✓ |
| ResendRequest | 2 | ✓ | ✓ |
| Reject | 3 | ✓ | ✓ |
| SequenceReset | 4 | ✓ | ✓ |
| Logout | 5 | ✓ | ✓ |
5.1 Logon
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=A | |
| 98 | EncryptMethod | Y | Valid values: 0: None |
| 108 | HeartBtInt | Y | Always set to 30s. |
| 141 | ResetSeqNumFlag | N | Always set to N. |
| 553 | Username | Y | |
| 554 | Password | Y | |
| <Standard Trailer> | Y |
* USERNAMES AND PASSWORDS ARE ALWAYS REQUIRED WHEN ACCESSING THE SYSTEM. THEY WILL BE SECURELY PROVIDED UPON ACTIVATION OF YOUR FIX SESSION.
5.2 Heartbeat
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=0 | |
| 112 | TestReqID | N | Required when the heartbeat is the result of a Test Request message. |
| <Standard Trailer> | Y |
5.3 TestRequest
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=1 | |
| 112 | TestReqID | Y | |
| <Standard Trailer> | Y |
5.4 ResendRequest
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=2 | |
| 7 | BeginSeqNo | Y | |
| 16 | EndSeqNo | Y | 0 represents infinity. |
| <Standard Trailer> | Y |
5.5 Reject
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=3 | |
| 45 | RefSeqNum | Y | MsgSeqNum <34> of rejected message |
| 58 | Text | N | Where possible, message to explain reason for rejection |
| 371 | RefTagID | N | The tag number of the FIX field being referenced. |
| 372 | RefMsgType | N | The MsgType <35> of the FIX message being referenced. |
| 373 | SessionRejectReason | N | Code to identify reason for a session-level Reject <3> message. |
| <Standard Trailer> | Y |
5.6 SequenceReset (GapFill)
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=4 | |
| 123 | GapFillFlag | Y | Always sets to Y. |
| 36 | NewSeqNo | Y | |
| <Standard Trailer> | Y |
5.7 Logout
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=5 | |
| 58 | Text | N | Message to explain reason for logout |
| <Standard Trailer> | Y |
6. Application Level Messages
| Name | MsgType | Incoming | Outgoing |
|---|---|---|---|
| NewOrderSingle | D | ✓ | - |
| OrderCancelReplaceRequest | G | ✓ | - |
| OrderCancelRequest | F | ✓ | - |
| ExecutionReport | 8 | - | ✓ |
| CancelReplaceReject | 9 | - | ✓ |
6.1 NewOrderSingle
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=D | |
| 1 | Account | Y | Trading account on Webull platform. |
| 11 | ClOrdID | Y | Unique identifier of the order. Must be 64 characters or less. |
| 15 | Currency | N | Identifies currency used for price. If provided, must match the trading currency of the security (e.g., USD for US securities). If the value does not match, Webull will ignore this tag and default to the security's native trading currency. |
| 21 | HandlInst | N | Instructions for order handling on Broker trading floor. Valid values: 1: Automated execution order, private, no Broker intervention |
| 38 | OrderQty | Y | Number of shares ordered. |
| 40 | OrdType | Y | Valid values: 1: Market 2: Limit 3: Stop 4: StopLimit 5: MarketOnClose (MOC) B: LimitOnClose (LOC) See supported ordTypes in different markets. MarketOnOpen (MOO): tag40=1(Market) and tag59=2 (At the opening); LimitOnOpen (LOO): tag40=2(Limit) and tag59=2 (At the opening). |
| 44 | Price | N | Required if OrdType<40> is one of: • Limit(2) • StopLimit(4) • LimitOnClose (B) |
| 54 | Side | Y | Valid values: • US common stock: - 1: Buy - 2: Sell - 5: Sell Short |
| 22 | IDSource | N | Identifies class of the SecurityID <48> value. Required if SecurityID <48> is specified. Valid values: 1 = CUSIP 4 = ISIN Number |
| 48 | SecurityID | N | The value of the security identifier and its classification is defined by IDSource<22>. |
| 55 | Symbol | Y | Common Stock: ticker symbol. |
| 65 | SymbolSfx | N | Required if a stock symbol has a suffix, such as BRK.A. |
| 58 | Text | N | |
| 59 | TimeInForce | Y | Valid values: 0: Day 1: Good-Till-Cancelled 2: At-The-Opening For Good-Til-Cancelled(1) orders, please note that they will still expire 90 calendar days after the order placement date, including the day the order is placed. See supported timeInForces in different market. |
| 60 | TransactTime | Y | Time this order request was initiated/released by the trader or trading system. Time/date combination represented in UTC (Universal Time Coordinated, also known as "GMT") in either YYYYMMDD-HH:MM:SS (whole seconds) or YYYYMMDD-HH:MM:SS.sss (milliseconds) format, colons, dash, and period required. |
| 99 | StopPx | N | Required if OrdType<40> is one of: • Stop(3) • StopLimit(4) |
| 100 | ExDestination | N | Execution destination as defined by institution when order is entered. Only applicable to U.S. stocks. Valid values: SMART: System chooses the best execution exchange smartly. |
| 109 | ClientID | N | Used for firm identification in third-party transactions. For example, if you are a broker, this field sets UUID of the broker user, when placing/modify/cancel order. |
| 152 | CashOrderQty | N | Populated with the amount in cash to be purchased or sold. Only for US stock. |
| 167 | SecurityType | N | Valid values: CS: Common Stock |
| 207 | SecurityExchange | N | Valid values: US: US exchanges |
| 336 | TradingSessionID | N | Identifier for Trading Session. Only for US common stock. Valid values: CORE: regular trading sessions (default) ALL: all trading sessions including extended hours NIGHT: night session (8pm-4am) |
| 9000 | Algorithm | N | Required to send ALGO order. Supported values: VWAP TWAP POV |
| 9023 | TargetParticipation | N | Target volume percentage. Required when Tag 9000 (Algorithm) = "POV". Rules: Double (positive 1 to 99) %. For example, 12 represents 12% |
| 9003 | StartTime | N | When the algorithm is to start executing. Format: YYYYMMDD-HH:MM:SS, UTC timestamp. Default value is session open time if not provided. |
| 9004 | EndTime | N | When the algorithm is to be done executing. Format: YYYYMMDD-HH:MM:SS, UTC timestamp. Default value is session end time if not provided. |
| <Standard Trailer> | Y |
6.2 OrderCancelReplaceRequest
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=G | |
| 1 | Account | Y | Trading account on Webull platform. |
| 11 | ClOrdID | Y | Unique identifier of replacement order as assigned by institution or by the intermediary with closest association with the investor. Note that this identifier will be used in ClOrdID field of the Cancel Reject message if the replacement request is rejected. Must be 64 characters or less. |
| 15 | Currency | N | Must match original order. |
| 21 | HandlInst | N | Must match original order. |
| 38 | OrderQty | Y | OrderQty after replaced. |
| 41 | OrigClOrdID | Y | ClOrdID of the previous non rejected order (NOT the initial order of the day) when canceling or replacing an order. |
| 40 | OrdType | Y | Must match original order. |
| 44 | Price | N | Price after replaced. Required if OrdType<40> is one of: • Limit(2) • StopLimit(4) • LimitOnClose (B) |
| 54 | Side | Y | Must match original order. |
| 22 | IDSource | N | Identifies class of the SecurityID <48> value. Required if SecurityID <48> is specified. Valid values: 1 = CUSIP 4 = ISIN Number |
| 48 | SecurityID | N | The value of the security identifier and its classification is defined by IDSource<22>. |
| 55 | Symbol | Y | Must match original order. |
| 65 | SymbolSfx | N | Must match original order. |
| 58 | Text | N | |
| 59 | TimeInForce | Y | Must match original order. |
| 60 | TransactTime | Y | Time this order request was initiated/released by the trader or trading system. Time/date combination represented in UTC (Universal Time Coordinated, also known as "GMT") in either YYYYMMDD-HH:MM:SS (whole seconds) or YYYYMMDD-HH:MM:SS.sss (milliseconds) format, colons, dash, and period required. |
| 99 | StopPx | N | StopPx after replaced. Required if OrdType<40> is one of: • Stop(3) • StopLimit(4) |
| 109 | ClientID | N | Used for firm identification in third-party transactions. For example, if you are a broker, this field sets UUID of the broker user, when placing/modify/cancel order. |
| 152 | CashOrderQty | N | Populated with the amount in cash to be purchased or sold. Only for US stock. |
| 167 | SecurityType | N | Must match original order. |
| 207 | SecurityExchange | N | Valid values: US: US exchanges |
| 336 | TradingSessionID | N | Must match original order. |
| 9000 | Algorithm | N | Required to send ALGO order. Supported values: VWAP TWAP POV |
| 9023 | TargetParticipation | N | Target volume percentage. When the Tag9000 Algorithm is 'POV', then the tag9023 is required. Rules: Double (positive 1 to 99) %. For example, 12 represents 12% |
| 9003 | StartTime | N | When the algorithm is to start executing. Format: YYYYMMDD-HH:MM:SS, UTC timestamp. Default value is session open time if not provided. |
| 9004 | EndTime | N | When the algorithm is to be done executing. Format: YYYYMMDD-HH:MM:SS, UTC timestamp. Default value is session end time if not provided. |
| <Standard Trailer> | Y |
6.3 OrderCancelRequest
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=F | |
| 1 | Account | Y | Trading account on Webull platform. |
| 11 | ClOrdID | Y | Unique identifier of cancel order as assigned by institution or by the intermediary with closest association with the investor. Note that this identifier will be used in ClOrdID field of the Cancel Reject message if the Cancel request is rejected. Must be 64 characters or less. |
| 15 | Currency | N | Must match original order. |
| 21 | HandlInst | N | Must match original order. |
| 41 | OrigClOrdID | Y | ClOrdID of the previous non rejected order (NOT the initial order of the day) when canceling or replacing an order. |
| 38 | OrderQty | N | |
| 109 | ClientID | N | Used for firm identification in third-party transactions. For example, if you are a broker, this field sets UUID of the broker user, when placing/modify/cancel order. |
| 167 | SecurityType | N | Must match original order. |
| 207 | SecurityExchange | N | Valid values: US: US exchanges |
| 22 | IDSource | N | Identifies class of the SecurityID <48> value. Required if SecurityID <48> is specified. Valid values: 1 = CUSIP 4 = ISIN Number |
| 48 | SecurityID | N | The value of the security identifier and its classification is defined by IDSource<22>. |
| 55 | Symbol | Y | Must match original order. |
| 65 | SymbolSfx | N | |
| 54 | Side | Y | Must match original order. |
| 60 | TransactTime | Y | Time this order request was initiated/released by the trader or trading system. Time/date combination represented in UTC (Universal Time Coordinated, also known as "GMT") in either YYYYMMDD-HH:MM:SS (whole seconds) or YYYYMMDD-HH:MM:SS.sss (milliseconds) format, colons, dash, and period required. |
| <Standard Trailer> | Y |
6.4 ExecutionReport
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=8 | |
| 1 | Account | Y | Trading account on Webull platform. |
| 6 | AvgPx | Y | |
| 11 | ClOrdID | Y | Unique identifier of the order. |
| 14 | CumQty | Y | Currently executed shares for chain of orders. |
| 17 | ExecID | Y | Unique identifier of execution message. |
| 19 | ExecRefID | N | Required for Cancel and Correct ExecTransType <20> messages |
| 20 | ExecTransType | Y | Identifies transaction type. Valid values: 0: New 1: Cancel 2: Correct |
| 30 | LastMkt | N | |
| 31 | LastPx | Y | Price of this (last) fill. |
| 32 | LastShares | Y | Quantity of shares bought/sold on this (last) fill. |
| 37 | OrderID | Y | Unique for each chain of orders. |
| 38 | OrderQty | Y | |
| 39 | OrdStatus | Y | Describes the current state of a CHAIN of orders. Valid values: 0: New 1: Partially filled 2: Filled 3: Done for day 4: Canceled 5: Replaced 6: Pending Cancel 7: Stopped 8: Rejected 9: Suspended A: Pending New B: Calculated C: Expired D: Accepted for bidding E: Pending Replace |
| 40 | OrdType | N | |
| 41 | OrigClOrdID | N | ClOrdID <11> of the previous order (NOT the initial order of the day) as assigned by the institution, used to identify the previous order in cancel and cancel/replace requests. |
| 44 | Price | N | Required if specified on the order |
| 54 | Side | Y | |
| 55 | Symbol | Y | |
| 65 | SymbolSfx | N | |
| 58 | Text | N | |
| 59 | TimeInForce | Y | Valid values: 0: Day 1: Good-Til-Cancelled 2: At-The-Opening |
| 60 | TransactTime | Y | Time the transaction represented by this ExecutionReport occurred. Time/date combination represented in UTC (Universal Time Coordinated, also known as "GMT") in either YYYYMMDD-HH:MM:SS (whole seconds) or YYYYMMDD-HH:MM:SS.sss (milliseconds) format, colons, dash, and period required. |
| 99 | StopPx | N | Required if specified on the order |
| 103 | OrdRejReason | N | For optional use with ExecType <150> ='8' (Rejected) Valid values: 0: Broker option 1: Unknown symbol 2: Exchange closed 3: Order exceeds limit 4: Too late to enter 5: Unknown Order 6: Duplicate Order 7: Duplicate of a verbally communicated order 8: Stale Order 16: Order rejected because exceeds current price band. 99: Other reject reason. e.g. • Trade account permissions do not match. • The current security is not available. • Your account is currently unavailable for trading. • No Security Matched. • The security is unavailable for placing market order. • The quantity of buy to close exceeds the available quantity of buy to close. • Unknown exception. |
| 150 | ExecType | Y | Describes the specific ExecutionRpt <8> (i.e. Pending Cancel) while OrdStatus <39> will always identify the current order status (i.e. Partially Filled) Valid values: 0: New 1: Partially filled 2: Filled 3: Done for day 4: Canceled 5: Replaced 6: Pending Cancel 7: Stopped 8: Rejected 9: Suspended A: Pending New B: Calculated C: Expired D: Restated E: Pending Replace |
| 151 | LeavesQty | Y | Amount of shares open for further execution. If the OrdStatus <39> is Canceled, DoneForTheDay, Expired, Calculated, or Rejected (in which case the order is no longer active) then LeavesQty <151> could be 0, otherwise LeavesQty <151> = OrderQty <38> - CumQty <14>. |
| 167 | SecurityType | N | Valid values: CS: Common Stock |
| 207 | SecurityExchange | N | Valid values: US: US exchanges |
| 378 | ExecRestatementReason | N | Valid values: 0: GT_CORPORATE_ACTION 1: GT_RENEWAL_RESTATEMENT 2: VERBAL_CHANGE 3: REPRICING_OF_ORDER 4: BROKER_OPTION 5: PARTIAL_DECLINE_OF_ORDERQTY |
| <Standard Trailer> | Y |
6.5 CancelReplaceReject
| Field | Name | Req'd | Description |
|---|---|---|---|
| <Standard Header> | Y | MsgType<35>=9 | |
| 1 | Account | Y | Trading account on Webull platform. |
| 11 | ClOrdID | Y | Unique identifier of the order. |
| 37 | OrderID | Y | Unique for each chain of orders. |
| 41 | OrigClOrdID | Y | ClOrdID <11> of the previous order (NOT the initial order of the day) as assigned by the institution, used to identify the previous order in cancel and cancel/replace requests. |
| 39 | OrdStatus | Y | Describes the current state of a CHAIN of orders. |
| 58 | Text | N | |
| 434 | CxlRejResponseTo | Y | Valid values: 1: Order Cancel Request 2: Order Cancel/Replace Request |
| 102 | CxlRejReason | N | Valid values: 0: Too late to cancel 1: Unknown order 2: Broker / Exchange Option 3: Order already in Pending Cancel or Pending Replace status 99: Other |
| <Standard Trailer> | Y |
7. Appendix
7.1 Supported OrderTypes in Different Markets
US Market:
| OrderType/SecurityType | CommonStock |
|---|---|
| Market(1) | ✓ |
| Limit(2) | ✓ |
| Stop(3) | ✓ |
| StopLimit(4) | ✓ |
| MarketOnClose(5) | ✓ |
| LimitOnClose(B) | ✓ |
| MarketOnOpen | ✓ |
| LimitOnOpen | ✓ |
| Algorithm | ✓ |
7.2 Supported TimeInForce in Different Markets
| Market | SecurityType | Day (0) | Good-Till-Cancel (1) | At-The-Opening (2) |
|---|---|---|---|---|
| US | Common Stock | ✓ | ✓ | ✓ |
8. Revision History
| Revision No. | Date | Description of Changes |
|---|---|---|
| V1.1 | May, 2024 | Initial Document |
| v1.2 | July, 2024 | Add Tag115 |
| v1.3 | Feb, 2025 | Fix Tag167 description |
| v1.4 | Feb, 2025 | Add Tag50 |
| v1.5 | Apr, 2025 | Add Tag100 |
| v1.6 | Apr, 2025 | Add Tag152. U.S. stock fractional order by amount. |
| v1.7 | Jun, 2025 | Add algorithmic orders with tags related to US stocks. Tag 9000, Tag 9023, Tag 9003, Tag 9004 |
| v1.8 | Dec, 2025 | Remove fix password salt |
| v1.9 | June, 2026 | Add Tag15, Tag21, Tag109, Tag378 |