Skip to main content
The polymarket_polygon.combo_details table is the dimension table for Polymarket Combos (multi-leg parlays): one row per combo outcome token — a YES and a NO row per combo, the same grain as market_details, so any token ID joins either dimension the same way. Left join it onto combo_trades / positions on token_id. The YES token pays out only if every leg wins. Legs are expanded and labeled inline: combo_name / leg_names are generated from the legs’ questions and outcomes and stay NULL unless every leg is labeled. Per share, the YES side pays the product of the legs’ payout fractions and NO pays 1 minus that — so the combo is decided as soon as any leg loses, and NO holders can redeem before the remaining legs resolve.

Table Schema

ColumnTypeDescription
token_idUINT256v3 PositionManager token ID of this side of the combo (combo condition × 256 + outcome index); joins combo_trades.asset_id
outcome_indexINTEGERSide of this row: 0 = YES, 1 = NO
token_outcomeVARCHARSide of this row as label: Yes (pays out only if every leg wins) or No
combo_condition_idVARBINARYCombo condition ID (bytes31); two rows share it (YES and NO)
combo_condition_id_uintUINT256Combo condition ID as uint256 (= token_id / 256)
combo_nameVARCHARGenerated name: question: outcome AND question: outcome ... in leg order; NULL unless every leg has question and outcome labels
token_outcome_nameVARCHARYes-/No- + combo_name, mirroring market_details.token_outcome_name; NULL until every leg is labeled
leg_namesARRAY(VARCHAR)Per-leg labels (question: outcome) in leg order; entries are NULL for unlabeled legs (v3-native or API-lagged markets)
legsARRAY(UINT256)Ordered on-chain legs array (leg position IDs)
leg_countBIGINTNumber of legs
labeled_leg_countBIGINTNumber of legs with question and outcome labels; combo_name is NULL unless this equals leg_count
legs_resolved_countBIGINTNumber of legs whose underlying condition has resolved on-chain
lost_leg_countBIGINTNumber of legs that resolved against the combo; a single lost leg decides the combo as no
is_resolvedBOOLEANTRUE once the combo’s outcome is known: any leg lost, or every leg resolved
combo_outcomeVARCHARHow the combo resolved (same on both rows): yes when every leg won, no when any leg lost, partial when a 50/50-resolved leg leaves the payout fractional; NULL while undecided
settlement_valueDOUBLEWhat THIS side settled at per share: the YES row pays the product of the legs’ payout fractions, the NO row pays 1 minus that. NULL while undecided
resolved_atTIMESTAMPTime the outcome became known: the first lost leg’s resolution, or the last leg’s resolution when all legs resolved; NULL while undecided
created_atTIMESTAMPBlock time the combo was registered on-chain
block_numberBIGINTBlock number the combo was registered in
evt_indexINTEGEREvent index of the registration event
tx_hashVARBINARYTransaction that registered the combo
_updated_atTIMESTAMPTime this row was last (re)computed

Table sample

Example query