> ## Documentation Index
> Fetch the complete documentation index at: https://dune-automated-update-duneapi-openapi-files.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# polymarket_polygon.positions

> Polymarket positions — daily outcome token balances by wallet, priced at the day's close and settled to the exact payout once decided.

export const TableSample = ({tableName, tableSchema}) => <>
    <div className="hidden dark:block">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}&darkMode=true`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
    <div className="dark:hidden">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
  </>;

The `polymarket_polygon.positions` table records what every wallet holds, day by day, and what it is worth: one row per `(day, address, token_id)`, covering regular markets **and Combos** (multi-leg parlays, `is_combo = TRUE`), priced at the day's close from [`ohlcv_hourly`](/data-catalog/curated/prediction-markets/polymarket/ohlcv_hourly) — the exact settlement value once the market is decided.

The table carries **positions and prices only**, kept deliberately small. Labels, outcomes, resolution state, market names, and links live one join away on `token_id`: [`market_details`](/data-catalog/curated/prediction-markets/polymarket/market_details) for markets, [`combo_details`](/data-catalog/curated/prediction-markets/polymarket/combo_details) for combos. Tokens unknown to their dimension are dropped.

Coverage spans the legacy v2 CTF ledger and v3 PositionManager module 3 (combos). v3 single markets — PositionManager modules 1 and 2 — are outside the table's scope.

<Note>
  **Excluded rows.** Zero balances (a wallet that exited simply has no row from that day on), the NegRiskAdapter's NO-token burn sink (`kNoTokenBurnAddress`, not a real holder), and — from the day *after* the decision — decided positions worth under one cent, i.e. concluded losers and sub-cent winner dust that cannot be redeemed. The decision day itself still shows every position, and pre-decision history stays intact.
</Note>

## Table Schema

| Column                 | Type        | Description                                                                                                                                                                                                                                                                                          |
| ---------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `day`                  | `DATE`      | Date of the balance snapshot                                                                                                                                                                                                                                                                         |
| `address`              | `VARBINARY` | Wallet holding the position                                                                                                                                                                                                                                                                          |
| `market_id`            | `VARCHAR`   | ID of the market or combo this token belongs to, as a `0x...` string: `condition_id` for markets, `combo_condition_id` for combos. Joins `ohlcv_hourly` and `prediction_markets.trades` directly on `market_id`, and groups the two sides of one market or combo. Not the neg-risk `event_market_id` |
| `token_id`             | `UINT256`   | ID of the exact token held (the market side or combo side). Join it to `market_details.token_id` (markets) or `combo_details.token_id` (combos) for names, legs, and settlement values                                                                                                               |
| `is_combo`             | `BOOLEAN`   | TRUE if this is a Combo (a multi-leg parlay), FALSE for a regular market                                                                                                                                                                                                                             |
| `balance`              | `DOUBLE`    | Number of shares held. Which side the token is (Yes/No/Up/team name) and how the market resolved live in `market_details` / `combo_details`, joined on `token_id`                                                                                                                                    |
| `price`                | `DOUBLE`    | USD price of one share on that day: the day-close trade price (carried through quiet days; latest available for the current day) until decided, then the settlement value — 1/0 per side, 0.5 for 50/50 markets, the payout fraction for combos. NULL only while undecided and never traded          |
| `balance_usd`          | `DOUBLE`    | USD value of the position (`balance * price`; a winning share pays \$1). NULL when `price` is NULL                                                                                                                                                                                                   |
| `_position_updated_at` | `TIMESTAMP` | When this balance last changed onchain                                                                                                                                                                                                                                                               |
| `_updated_at`          | `TIMESTAMP` | Row change watermark for incremental sync: the build time of the row's last actual change (unchanged rows are not restamped)                                                                                                                                                                         |

## Table sample

<TableSample tableSchema="polymarket_polygon" tableName="positions" />

## Query performance

`positions` is partitioned by `day` — always filter on `day`.

## Example queries

```sql theme={null}
-- Portfolio value of one wallet over the last 30 days
SELECT
  day,
  SUM(balance_usd) AS portfolio_usd
FROM polymarket_polygon.positions
WHERE address = 0x...
  AND day >= CURRENT_DATE - INTERVAL '30' DAY
GROUP BY 1
ORDER BY 1
```

```sql theme={null}
-- Largest holders of one market's YES side on the latest snapshot day,
-- with market metadata joined in on token_id
SELECT
  p.address,
  p.balance,
  p.balance_usd,
  m.question,
  m.token_outcome
FROM polymarket_polygon.positions AS p
JOIN polymarket_polygon.market_details AS m
  ON m.token_id = p.token_id
WHERE p.day = CURRENT_DATE - INTERVAL '1' DAY
  AND m.question = 'Will X happen by Y date?'
  AND m.outcome_index = 0
ORDER BY p.balance DESC
LIMIT 20
```
