The ExecutionReport [8] message is used to acknowledge various order lifecycle events including the acceptance, rejection, and expiry of orders, as well as providing details of matches (fills) against orders.
All orders entering the Platform are first either accepted or rejected using an Execution Report [8]. The order may then receive further Execution Reports [8] as necessary given their marketability and TimeInForce (59) constraints. For example:
- A badly-formatted order which fails validation upon entry will receive an ExecutionReport [8] with OrdStatus (39) = 8 (Rejected).
- A good for day order which is not immediately executable will receive an ExecutionReport [8] with OrdStatus (39) = 0 (New). Should it receive executions during the course of the day, then these will be notified in subsequent Execution Report [8] messages with OrdStatus (39) = 1 (Partially Filled) and/or 2 (Fully Filled).
- An order with TimeInForce (59) = 6 (good till time) will receive an ExecutionReport [8] with OrdStatus (39) = 0 (New) upon entry. If it remains unexecuted, it will expire at the indicated ExpireTime (126) with an Execution Report [8] message with OrdStatus (39) = C (Expired).
- A Fill Or Kill order with TimeInForce (59) = 4 which can not be fully executed will first receive an ExecutionReport [8] with OrdStatus (39) = 0 (New) and then an immediate Execution Report [8] message with OrdStatus (39) = C (Expired).
- An order with TimeInForce (59) = 3 (immediate or cancel) which can be partially filled upon entry will receive at least three ExecutionReport [8] messages; the first will indicate OrdStatus (39) = 0 (New), the next messages will detail the fill(s), and the final Execution Report [8] message will expire the remainder with OrdStatus (39) = C (Expired).
Table 16: ExecutionReport (8) message
| Tag | Name | Req | Type | Description |
|---|---|---|---|---|
| < Standard Header > | Y | 35 = 8 | ||
| 1 | Account | N | String | Account reference if indicated on the original order |
| 6 | AvgPx | Y | Price | Volume-weighted average price of all trades against this order. May be zero for unexecuted orders. |
| 11 | ClOrdID | Y | String | The participant-assigned ClOrdID value as sent on the last order action message form the Participant (new order, amendment or cancel). |
| 12 | Commission | N | Amt | Commission amount charged on this fill. Present on trades only. |
| 13 | CommType | N | char | Commission calculation method. 3=Absolute (total dollar amount) |
| 14 | CumQty | Y | Qty | Cumulative quantity so far for this order. May be zero for unexecuted orders. |
| 17 | ExecID | Y | String | Unique identifier for the Execution Report as assigned by Polymarket US. Typically a 13-character alphanumeric string. |
| 22 | SecurityIDSource | Y | String | Identifies source of SecurityID (48) value. 8=Exchange symbol |
| 31 | LastPx | Y | Price | Price of this last fill. Will be zero for messages not relating to a trade. |
| 32 | LastQty | Y | Qty | Quantity traded on this last fill. Will be zero for messages not relating to a trade. |
| 37 | OrderID | Y | String | Unique identifier for Order as assigned by Polymarket US. Typically a 13-character alphanumeric string. |
| 38 | OrderQty | Y | Qty | Total order quantity (amended as necessary) |
| 39 | OrdStatus | Y | char | The latest status of the order after any changes have been applied. 0=New, 1=Partially filled, 2=Fully filled, 4=Canceled, 8=Rejected, C=Expired |
| 40 | OrdType | Y | char | The type of order. 2=Limit, 3=Stop, 4=Stop Limit, K=Market with left over as limit |
| 41 | OrigClOrdID | N | String | Sent in the case of order amendment or cancellation. References the prior ClOrdID (11) value that the action amended/canceled. |
| 44 | Price | Y | Price | Order limit price (amended as necessary) |
| 48 | SecurityID | Y | String | Security identifier; will always match Symbol (55). |
| 54 | Side | Y | char | 1=Buy, 2=Sell |
| 55 | Symbol | Y | String | Instrument symbol |
| 460 | Product | Y | Int | Indicates the type of product the security is associated with. 1=AGENCY, 2=COMMODITY, 3=CORPORATE, 4=CURRENCY, 5=EQUITY, 6=GOVERNMENT, 7=INDEX, 8=LOAN, 9=MONEYMARKET, 10=MORTGAGE, 11=MUNICIPAL, 12=OTHER, 13=FINANCING, 14=ENERGY |
| 59 | TimeInForce | Y | char | Echoed from New Order Single. 0=Good for day, 1=Good till cancel, 3=Immediate or cancel, 4=Fill or kill, 6=Good till date |
| 60 | TransactTime | Y | UTCTime | Timestamp when the business transaction represented by the message occurred. |
| 99 | StopPx | Y | Price | Order stop price (amended as necessary). Will be zero for non stop orders. |
| 103 | OrdRejReason | N | int | Rejection reason (where OrdStatus = Rejected). 0=Broker/Exchange Option, 1=Unknown symbol, 2=Exchange closed (maintenance), 3=Order exceeds limit (price validation), 5=Unknown order, 6=Duplicate order (ClOrdID), 11=Unsupported order characteristic, 12=Surveillance option, 13=Incorrect quantity (lot size), 15=Unknown account (tag 1), 16=Price exceeds current price band, 18=Invalid price increment (tick size), 99=Other |
| 119 | SettlCurrAmt | N | Amt | Present on trades only. Total amount of this last fill. Equal to LastPx (31) x LastQty (32) |
| 126 | ExpireTime | N | UTCTime | Order expiry date (amended as necessary). |
| 150 | ExecType | Y | char | The reason that the Polymarket US sent this Execution Report. 0=New, 4=Canceled, 5=Replaced, 8=Rejected, C=Expired, F=Trade |
| 151 | LeavesQty | Y | Qty | Remaining, unexecuted quantity left on the order. May be zero for fully filled orders. |
| 381 | GrossTradeAmt | N | Amt | Present on orders which have been filled. Total amount traded across all fills for this order. Equal to AvgPx (6) x CumQty (38). |
| 581 | AccountType | N | Int | 1=CUSTOMER, 2=NON_CUSTOMER, 3=HOUSE_TRADER, 4=FLOOR_TRADER, 6=NON_CUSTOMER_CROSS_MARGINED, 7=HOUSE_TRADER_CROSS_MARGINED, 8=JOINT_BACK_OFFICE, 9=EQUITIES_SPECIALIST, 10=OPTIONS_MARKET_MAKER, 11=OPTIONS_FIRM_ACCOUNT, 12=AGGREGATED_CUSTOMER_AND_NON_CUSTOMER, 13=AGGREGATED_MULTIPLE_CUSTOMERS, 14=LIQUIDITY_PROVIDER, 15=OPERATING, 16=CLEARING_FUND, 17=FUTURES_MARKET_MAKER |
| 582 | CustOrderCapacity | N | Int | 1=OWN_ACCOUNT, 2=PROPRIETARY_ACCOUNT, 3=FINANCIAL_ADVISOR, 4=ALL_OTHER, 5=RETAIL_CUSTOMER |
| 453 | NoPartyIDs | N | Int | Number of PartyID (448), PartyIDSource (447), and PartyRole (452) entries |
| → 448 | PartyID | N | String | Party identifier/code |
| → 447 | PartyIDSource | N | char | D=Proprietary |
| → 452 | PartyRole | N | Int | 1=EXECUTING_FIRM, 3=CLIENT_ID, 24=CUSTOMER_ACCOUNT |
| 828 | TrdType | N | int | Present on trades only. 0=Regular trade |
| 880 | TrdMatchID | C | String | Always populated for trades. Note that buyer and seller will receive the same value. Will match the TradeID (1003) value on market data updates. Typically a 13-character alphanumeric string. |
| 1028 | ManualOrderIndicator | N | Boolean | Indicates if the order was initially received manually (as opposed to electronically) |
| 1057 | AggressorIndicator | C | Boolean | Always populated for trades. Identifies whether this order was the aggressor in the trade. |
| 378 | ExecRestatementReason | N | int | Indicates that the resting order has been canceled as a result of self-match prevention. 99=Self-match prevention |
| 110 | MinQty | N | Qty | Minimum required execution quantity for the order (if specified) |
| 6127 | ConditionTriggerMethod | N | int | The reference price used for triggering the stop order. 2=Last price, 5=Settlement price |
| 7928 | SelfMatchPreventionID | N | String | Unique identifier for the self-match prevention instruction. |
| 8000 | SelfMatchPreventionInstruction | N | String | Self-match instruction. O=Cancel oldest (resting) order, N=Cancel newest (aggressive) order |
| < Standard Trailer > | Y |
Figure 5: Simple limit order for 150 is acknowledged, partially filled for 100, and fully filled
Example 6: Acknowledgement of new limit order to buy 1,000 shares at 50.00