# Polymarket Combo (Parlay) Archive: on-chain fills, decoded legs and outcomes: schema ### polymarket/fills/fills_YYYY-MM-DD.parquet One row per decoded `OrderFilled` log of a COMBO token on Polymarket's combo exchange contract (V3 proxy). Day = UTC date of `block_time`. | column | type | meaning | |---|---|---| | block | int64 | Polygon block number | | block_time | timestamp[us, UTC] | the block's header time where `block_time_source` = `exact`; otherwise a linear-interpolation estimate (accuracy in COVERAGE.md) | | block_time_source | string | `exact` (block header), `interpolated` between true block times sampled every 1,000 blocks, or `extrapolated` past the last sample | | tx_hash, log_index | string, int32 | the on-chain transaction and log position (unique pair) | | order_hash | string | the filled order | | maker_id, taker_id | string | keyed-hash wallet id (`w_` + 16 hex; the same wallet has the same id everywhere in this release) or a protocol role (`contract:exchange_proxy`). Not anonymity: see Privacy in COVERAGE.md | | is_taker_order_row | bool | the row of the order that CROSSED (its order_hash equals OrdersMatched.taker_order_hash). A protocol fact, not a claim about who the trader is | | taker_order_label_source | string | `orders_matched` (v2 schema) or `is_intermediated_v1` (first ~24 h: the recorder's equivalent rule; COVERAGE.md reports its agreement with the decoded OrdersMatched logs) | | maker_side | string | BUY or SELL, for this row's maker | | condition_id | string | the combo's condition id in the combinatorial exchange (62 hex; join to combos/legs) | | outcome | string | YES or NO token of the combo | | price | float64 | USDC per share of THIS row's token (0-1) | | shares | float64 | shares (decimal; 6-dp on chain) | | usdc | float64 | USDC notional of this row (decimal) | | fee_usdc | float64 | protocol fee in USDC; non-zero only on the taker-order row | | builder | string | builder code (bytes32 hex) when set | | schema_era | string | `v1` (to 2026-08-07 02:55Z) or `v2` | | captured_at | timestamp[us, UTC] | when our recorder read the log: provenance only, never event time | | captured_clock_fault | bool | captured_at earlier than block_time (the 2026-09-29/30 recorder clock rollback) | ### polymarket/matches/matches_YYYY-MM-DD.parquet One row per `OrdersMatched` log (the v1 era's logs were archived undecoded and are decoded here with the recorder's own layout). | column | type | meaning | |---|---|---| | block, block_time, block_time_source | | as in fills | | tx_hash, log_index | string, int32 | the on-chain transaction and log position | | taker_order_hash | string | the order that crossed; equals `order_hash` of its taker-order fill row | | taker_id | string | keyed-hash id of the wallet that signed that order | | condition_id, outcome | string | the combo and its YES/NO token | | taker_side | string | BUY or SELL | | maker_amount, taker_amount | float64 | what the taker order gave / received, decimal units. BUY: maker_amount = USDC paid, taker_amount = shares received. SELL: maker_amount = shares given, taker_amount = USDC received | ### polymarket/combos.parquet One row per combo with at least one fill in THIS archive; the aggregates count only this archive's fills. | column | meaning | |---|---| | condition_id | the combo's condition id in Polymarket's combinatorial exchange (`Ids.sol` bytes31 as 62 hex), self-checked against its decoded legs. It is not a Gamma/CTF conditionId | | n_fills, n_taker_order_rows | fill rows / taker-order rows (the order that crossed) | | usdc_volume | sum of `usdc` over taker-order rows (counted once per match) | | first_fill_time, last_fill_time | block times of this archive's first and last fill | | decode_status | `decoded` (legs read on-chain and re-derived to the same id) or `undecoded` | | n_legs, legs_all_named | leg count; every leg has a market title | | outcome | result of the combo's YES token: `won` = every leg hit (YES paid 1), `lost` = YES paid 0 (NO holders were paid), `partial` = a void-class leg paid a fraction, `unresolved` = not resolved when read | | yes_payout | payout per YES share in USDC (0-1) | | outcome_read_at | when the payout was read on-chain (terminal results cannot change, so early reads stand) | ### polymarket/legs.parquet One row per (combo, leg). | column | meaning | |---|---| | condition_id, leg_index, n_legs | the combo and the leg's position in it | | leg_position_id | the leg's position id in the combinatorial exchange | | leg_condition_id | the leg position id without its outcome byte (exchange-internal; NOT Polymarket's Gamma/CTF conditionId) | | leg_market_condition_id | the leg market's Polymarket conditionId (0x..., joins to Gamma/CTF), from our daily market catalogs; null when the leg was not matched | | leg_side | YES / NO | | title, slug, needs, tags | market title and slug, the outcome this leg needs, catalog tags | | name_source | `stored` (named when decoded), `catalog_YYYY-MM-DD` (re-matched offline against that day's market catalog) or `unnamed` | | decoded_at | when the legs were decoded |