Skip to main content
combo_execution streams a Polymarket combo trade from the mempool, before it appears in the confirmed combo-trades API. It uses the same maker/taker trade model as the standard settlement stream and includes every signed order in the transaction.
This is a pending event. Use combo_status_update with the same tx_hash for confirmation. A dropped or replaced Polygon transaction may never confirm.

Example

How to read it

The top-level trade fields describe the taker order. In the example, the taker wallet bought 40.350877 YES combo shares at 0.57 for 22.999999 USDC. Each trades[] row describes one signed order from that order maker’s perspective. The complementary maker bought the NO position at 0.43 for the same 40.350877 shares. This is the same convention used by the settlement stream and by Exchange OrderFilled events. size always means shares. amount_usdc always means dollars. For BUY orders, the calldata’s maker amount is USDC, so PolyNode converts it to shares before emitting size. For SELL orders, the maker amount is already shares. The conversion is performed in both directions so clients do not need to interpret raw fixed-point amounts. price is the actual fill price, not merely the signed order’s limit price. This matters when one taker order receives price improvement across multiple maker orders. amount_usdc is the gross fill value. fee is reported separately and is not subtracted from it.

Multiple maker orders

A transaction with three maker orders and one taker order contains four trades[] rows and four order_hashes. These arrays are one-to-one and use the same order: maker orders in calldata order, followed by the taker order. Use trades[i].order_hash when working with an individual row. Top-level taker_size and amount_usdc are the taker order’s total filled shares and gross USDC value across all makers. taker_price is the effective fill price (amount_usdc / taker_size), rounded to four decimal places. This is why a live multi-maker payload can be longer than the two-order example above without introducing any additional field types.

Mapping to the static combo-trades API

After confirmation, the same fill appears in GET /v3/wallets/{address}/combos/trades. The static endpoint additionally has confirmed-only fields such as block_number, log_index, and the on-chain timestamp.

Fields

Execution

Trade row

Leg row

position_id and the decoded structural fields come directly from calldata. Every leg also includes a nested market object with the leg market’s title, slug, image, event, outcomes, and CLOB token IDs. PolyNode resolves this metadata ahead of trading, and attaching it never delays the event. A market Polymarket listed in the last couple of minutes can briefly arrive without market.

Leg market

On current markets, market.token_ids and the leg position_id are different identifiers. The leg position_id identifies the selected outcome inside the combo, while market.token_ids[outcome_index] is the CLOB token ID for that same outcome. Use the CLOB token ID with order-book, price, and trade endpoints. In the example, the first leg selects outcome 1 (Chicago Sky), so its CLOB token ID is 103031736784837797872355003049421848467848734930275080911268726099634278504076. Polymarket Protocol V2 markets, which Polymarket plans to use for new markets from around November 2, 2026, trade on the CLOB by their position IDs, per Polymarket. For those markets market.token_ids therefore carries the market’s position IDs, which are its CLOB token IDs.

Subscribe