polynode gives you two layers of trade data. Which one you use depends on what you’re building.Documentation Index
Fetch the complete documentation index at: https://docs.polynode.dev/llms.txt
Use this file to discover all available pages before exploring further.
Two data layers, one subscription
When you subscribe tosettlements, you get two events per trade:
settlement(pending) — arrives 3–5 seconds before the block. Decoded from the transaction’s calldata while it’s still in the mempool.status_update(confirmed) — arrives when the block confirms. Includesconfirmed_fillswith exact execution data from on-chainOrderFilledreceipt logs.
How they differ
The pending settlement and confirmed fills come from different data sources inside the same transaction:| Pending settlement | Confirmed fills | |
|---|---|---|
| Source | Transaction calldata (input) | OrderFilled receipt logs (output) |
| Speed | 3–5 seconds before the block | At block confirmation |
| Price accuracy | Exact for single-maker fills. Off by 0.01–0.04 on ~5% of multi-maker fills. | Exact. Always. This is the on-chain canonical record. |
| Size | Gross token amount | Gross token amount (separate fee field) |
| Per-fill detail | Per-maker breakdown from calldata | Per-maker breakdown from receipt logs |
OrderFilled logs. For most fills, the estimate and the result are identical. For multi-maker sweeps, the contract’s integer rounding can produce slightly different per-maker splits.
Size vs Polymarket: Polymarket’s activity API reports sizes net of fees. polynode’s confirmed fills report the gross size from the OrderFilled event plus the fee as a separate field. To get the Polymarket-equivalent size: net_size = size - (fee / price).
Use case 1: Copy trading
For copy trading, use the pending settlement. Speed matters more than the 0.01 price difference on the occasional multi-maker fill. To find the wallet’s actual trade in a settlement event, iteratedata.trades[] and match by maker:
Use case 2: Analytics and bookkeeping
For trade logs, P&L tracking, portfolio analytics, or any scenario where you need exact prices, useconfirmed_fills from the status_update.
Use case 3: Full lifecycle tracking
Track both layers to get the complete picture — early detection plus exact execution. Match bymaker in both the pending trades[] array and the confirmed confirmed_fills[] array:
Confirmed fills field reference
Each object in theconfirmed_fills array:
| Field | Type | Description |
|---|---|---|
order_hash | string | EIP-712 order hash for this fill |
maker | string | Maker wallet address |
taker | string | Taker wallet or exchange contract |
token_id | string | Conditional token ID for this fill |
side | string | "BUY" or "SELL" (maker’s perspective) |
price | number | Exact execution price |
size | number | Gross token amount (before fees) |
maker_amount | string | Raw maker amount (integer, 6 decimals for USDC) |
taker_amount | string | Raw taker amount (integer) |
fee | number | Fee in USDC, or null |
Ghost fills and the nonce exploit
A small percentage of Polymarket settlements (~0.15–0.35%) fail on-chain. These are “ghost fills” — trades that appear to match off-chain but revert during on-chain settlement. The most common cause is theincrementNonce() exploit on Polymarket’s V1 CTF Exchange, which allows users to invalidate their own orders after matching but before settlement.
This is another reason to use confirmed_fills for any application where trade accuracy matters. A pending settlement event tells you a trade was matched. Only a status_update with confirmed_fills tells you it actually settled on-chain.
To detect ghost fills, track pending settlements that never receive a status_update:

