settlement event via tx_hash, includes the confirmation latency, and attaches confirmed fill data from on-chain OrderFilled receipt logs.
The confirmed_fills array contains the exact execution prices and sizes from the blockchain — the same data source Polymarket’s own activity API reads. This gives you both speed (pre-confirmation detection) and accuracy (on-chain execution data) in a single subscription.
{
"data": {
"block_number": 85296338,
"condition_id": "0xcd1b782d94423552e19db1ca2bec7bcf5a445de8586638e41da75fae3d138ac4",
"confirmed_at": 1775713418000,
"confirmed_fills": [
{
"order_hash": "0x8238c0666c...",
"maker": "0x48ac40fc...",
"taker": "0xc51f90d3...",
"token_id": "97486603884638701907147078120258734284412618667021950609483989581295500093074",
"side": "BUY",
"price": 0.56,
"size": 2.25,
"maker_amount": "1260000",
"taker_amount": "2250000",
"fee": 0.176785
},
{
"order_hash": "0x3d388dd54a...",
"maker": "0x25f4707c...",
"taker": "0xc51f90d3...",
"token_id": "97486603884638701907147078120258734284412618667021950609483989581295500093074",
"side": "BUY",
"price": 0.56,
"size": 7.0,
"maker_amount": "3920000",
"taker_amount": "7000000",
"fee": 0.55
}
],
"event_title": "Augusta National Invitational - Winner ",
"event_type": "status_update",
"latency_ms": 3928,
"maker_wallets": [
"0x48ac40fc...",
"0x25f4707c..."
],
"market_slug": "will-charl-schwartzel-win-the-2026-masters-tournament",
"market_title": "Will Charl Schwartzel win the 2026 Masters tournament?",
"neg_risk": true,
"order_hashes": [
"0x8238c0666c...",
"0x3d388dd54a..."
],
"outcome": "No",
"outcomes": ["Yes", "No"],
"pending_detected_at": 1775713414072,
"taker_wallet": "0xc51f90d3...",
"tick_size": 0.001,
"token_id": "97486603884638701907147078120258734284412618667021950609483989581295500093074",
"tx_hash": "0x7599f442e4..."
},
"timestamp": 1775713418000,
"type": "status_update"
}
Fields
string
required
Always
"status_update".number
required
Unix milliseconds of the confirmation.
object
required
Show data fields
Show data fields
string
required
Transaction hash — matches the original
settlement event.string
required
Conditional token ID.
number
required
Block where the transaction was included.
number
required
Unix milliseconds of block confirmation.
number
required
Unix milliseconds when the transaction was first detected by polynode.
number
required
Time between initial detection and block confirmation, in milliseconds. Typical values: 2000–5000ms (median ~2900ms). Corresponds to 1–2 Polygon blocks.
string
required
Taker wallet address from the original settlement.
string[]
Maker wallet addresses from the original settlement.
string[]
EIP-712 order hashes from the original pending settlement. Each hash uniquely identifies a maker’s limit order on Polymarket’s order book.
object[]
Exact fill data from on-chain
OrderFilled receipt logs. Each entry represents one maker’s fill with the precise execution price and size as settled by the contract. Present when receipt decoding succeeds (vast majority of blocks). null on the rare occasion receipt data is unavailable.Show confirmed fill fields
Show confirmed fill fields
string
EIP-712 order hash for this specific fill.
string
Maker wallet address.
string
Taker wallet address (or exchange contract address for the taker’s own fill event).
string
Conditional token ID for this specific fill.
string
"BUY" or "SELL" from the maker’s perspective.number
Exact execution price from the on-chain settlement. This is the canonical price — the same value Polymarket’s own APIs report.
number
Gross token amount filled (before fees). Polymarket’s activity API reports net-of-fee sizes, so this value will be slightly larger than what Polymarket shows. Use the
fee field to compute the net: net_size = size - fee / price.string
Raw maker amount from the OrderFilled event (integer string, 6 decimal precision for USDC).
string
Raw taker amount from the OrderFilled event (integer string).
number
Fee charged on this fill in USDC.
null if no fee.string
Market question. Enriched from metadata.
string
Outcome name. Enriched from metadata.
string
Market image URL. Enriched from metadata.
string
Market URL slug. Enriched from metadata.
string
Parent event title. Enriched from metadata.
boolean
Whether this market uses the negRisk contract type. Enriched from metadata.
number
Minimum price increment (e.g.
0.01 or 0.001). Enriched from metadata.number
Taker fee rate in basis points.
200 = 2%, 1000 = 10%, null = no fee. Short-term crypto markets (5-minute ETH/BTC) typically have 1000 (10%), while standard markets have 200 (2%). Enriched from Polymarket metadata.string
Market condition ID (CTF contract identifier). Enriched from metadata.
string[]
Ordered list of outcome names (e.g.
["Yes", "No"]). Index-aligned with token_ids. Enriched from metadata.string[]
Ordered list of token IDs for this market. Index-aligned with
outcomes. Enriched from metadata.object
Map of token ID to outcome name for all outcomes in this market (e.g.
{"123...": "Yes", "456...": "No"}). Enriched from metadata.status_update events arrive in bursts. A single Polygon block typically contains 30–80 Polymarket settlements, so expect 30–80 status_update messages within ~100ms each time a block confirms (~2s interval). If you only need pending detection, subscribe with "status": "pending" or exclude "status_update" from your event_types filter.How to use
Matchstatus_update events back to their settlement by tx_hash:
const pending = new Map(); // tx_hash → settlement data
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === "settlement" && msg.data.status === "pending") {
pending.set(msg.data.tx_hash, msg.data);
}
if (msg.type === "status_update") {
const original = pending.get(msg.data.tx_hash);
console.log(`Confirmed in ${msg.data.latency_ms}ms`, original);
// Use confirmed_fills for exact on-chain prices
if (msg.data.confirmed_fills) {
for (const fill of msg.data.confirmed_fills) {
console.log(` ${fill.side} ${fill.size} @ ${fill.price} (fee: ${fill.fee})`);
}
}
pending.delete(msg.data.tx_hash);
}
};

