Skip to main content

Polymarket API - Advanced Analytics

This guide shows GraphQL examples for deeper Polymarket metrics on Polygon (network: matic): TVL of Polymarket, daily trade aggregates, buy vs sell pressure for a market, large-trade streaming, split/merge settlement totals, and top markets by volume. All examples use dataset: realtime, which covers about the last 7 days of data. Use it together with the Polymarket API, Prediction Trades API, and Prediction Settlements API.

API Key Required

To run these queries outside the Bitquery IDE, you need an API access token. See How to generate Bitquery API token.

Contract addresses

Since the April 2026 migration, Polymarket trades on the CTF Exchange 0xE111180000d2663C0091e4f400237545B87B996B and Neg Risk CTF Exchange 0xe2222d279d744050d28e00520010520000310F59, and settles in pUSD 0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB (a USDC-backed wrapper around USDC.e). Confirm addresses against the Polymarket contracts page before production use; deployments can change over time.

Dataset: realtime and retention

Polymarket prediction-market data on Polygon (PredictionTrades, PredictionSettlements, and related examples on this page) must use dataset: realtime. This dataset holds roughly the last 7 days, so use time filters that fall inside that window. For longer history, see Polymarket historical data exports.


Overview​

TopicAPIWhat you get
TVL PolymarketTransactionBalancesLatest USDC.e and pUSD balances for listed custody addresses
Daily volume & maker/taker splitPredictionTradesShares (Amount), USDC collateral, split by Buyer vs CTF-style addresses
Order flow (hourly)PredictionTradesBuy vs sell pressure using IsOutcomeBuy, optional market title filter
Whale tradesPredictionTrades (subscription)Trades above a USD threshold
open Interest (one day)PredictionSettlementsSplit / merge USDC and net (liquidity-style proxy, not CLOB OI)
Top markets by volumePredictionTradesMarkets ranked by buy + sell USD over 24 hours


USDC TVL: balances for Conditional Tokens and neg-risk collateral​

Summarize collateral held by Conditional Tokens and neg-risk wrapped collateral contracts. Traders now hold and settle in pUSD (0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB), but the collateral adapters unwrap it on the way in, so custody inside these contracts is still USDC.e (0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174). The query reads both tokens; expect USDC.e to carry almost all of the balance. Extend the Address list if you track additional custodians.

Run in Bitquery IDE

query PolymarketCollateralTVL {
EVM(dataset: realtime, network: matic) {
TransactionBalances(
where: {
TokenBalance: {
Address: {
in: [
"0x4D97DCd97eC945f40cF65F87097ACe5EA0476045"
"0x3A3BD7bb9528E159577F7C2e685CC81A765002E2"
]
}
Currency: {
SmartContract: {
in: [
"0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB"
"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
]
}
Fungible: true
}
}
}
) {
TokenBalance {
Address
PostBalance(maximum: Block_Time)
PostBalanceInUSD(maximum: Block_Time)
Currency {
Symbol
SmartContract
Decimals
}
}
}
}
}

Daily volume: notional shares, USDC, and buyer-address split​

For a single calendar day (UTC), aggregate:

  • volume_notional_shares: sum of outcome Amount (share-like notional)
  • volume_usdc: sum of CollateralAmountInUSD
  • taker_volume_usdc_address_rule: USDC where Buyer is in $PolymarketContractAddresses
  • maker_volume_usdc_address_rule: USDC where Buyer is not in that list

Use dataset: realtime (see the Dataset: realtime and retention note at the top of this page).

Run in Bitquery IDE

query PolymarketVolume(
$date: String!
$PolymarketContractAddresses: [String!]!
) {
EVM(dataset: realtime, network: matic) {
PredictionTrades(
where: {
TransactionStatus: { Success: true }
Block: { Date: { is: $date } }
Trade: {
Prediction: { Marketplace: { ProtocolName: { is: "polymarket" } } }
}
}
) {
Block {
Date
}
volume_notional_shares: sum(of: Trade_OutcomeTrade_Amount)
volume_usdc: sum(of: Trade_OutcomeTrade_CollateralAmountInUSD)
taker_volume_usdc_address_rule: sum(
of: Trade_OutcomeTrade_CollateralAmountInUSD
if: {
Trade: {
OutcomeTrade: { Buyer: { in: $PolymarketContractAddresses } }
}
}
)
maker_volume_usdc_address_rule: sum(
of: Trade_OutcomeTrade_CollateralAmountInUSD
if: {
Trade: {
OutcomeTrade: { Buyer: { notIn: $PolymarketContractAddresses } }
}
}
)
}
}
}

Variables (example):

{
"date": "2026-09-17",
"PolymarketContractAddresses": [
"0xe111180000d2663c0091e4f400237545b87b996b",
"0xe2222d279d744050d28e00520010520000310f59"
]
}

Order flow: buy vs sell pressure by hour​

Bucket trades by hour and split collateral USD using IsOutcomeBuy (see Prediction Trades API: trade direction).

One market (filter by exact question title)​

Run in Bitquery IDE

query PolymarketOrderFlowPressureOneMarket(
$hours_ago: Int!
$marketTitle: String!
) {
EVM(dataset: realtime, network: matic) {
PredictionTrades(
orderBy: { ascending: Block_Time }
where: {
TransactionStatus: { Success: true }
Block: { Time: { since_relative: { hours_ago: $hours_ago } } }
Trade: {
Prediction: {
Marketplace: { ProtocolName: { is: "polymarket" } }
Question: { Title: { is: $marketTitle } }
}
}
}
) {
Block {
Time(interval: { count: 1, in: hours })
}
Trade {
Prediction {
Question {
MarketId
Title
}
}
}
buy_pressure_usd: sum(
of: Trade_OutcomeTrade_CollateralAmountInUSD
if: { Trade: { OutcomeTrade: { IsOutcomeBuy: true } } }
)
sell_pressure_usd: sum(
of: Trade_OutcomeTrade_CollateralAmountInUSD
if: { Trade: { OutcomeTrade: { IsOutcomeBuy: false } } }
)
}
}
}

Variables (example):

{
"hours_ago": 24,
"marketTitle": "US x Iran ceasefire by April 30?"
}

Whale trades: subscription above a USD threshold​

Stream successful Polymarket trades whose collateral exceeds $10,000 USD. Adjust the threshold string as needed.

Run in Bitquery IDE

subscription PolymarketWhaleTradesAlert {
EVM(dataset: realtime, network: matic) {
PredictionTrades(
where: {
TransactionStatus: { Success: true }
Trade: {
Prediction: { Marketplace: { ProtocolName: { is: "polymarket" } } }
OutcomeTrade: { CollateralAmountInUSD: { gt: "10000" } }
}
}
) {
Block {
Time
}
Trade {
OutcomeTrade {
Buyer
Seller
CollateralAmount
CollateralAmountInUSD
Price
PriceInUSD
IsOutcomeBuy
}
Prediction {
Question {
Title
MarketId
}
Outcome {
Label
}
}
}
Transaction {
Hash
}
}
}
}

Open Interest on Polymarket on a specific date​

For a calendar day, sum Split and Merge collateral USD and the net (split − merge). This describes Open Interest of that day.

Run in Bitquery IDE

query PolymarketSettlementFlowOneDay($day: String!) {
EVM(dataset: realtime, network: matic) {
PredictionSettlements(
where: {
Block: { Date: { is: $day } }
Settlement: {
Prediction: { Marketplace: { ProtocolName: { is: "polymarket" } } }
}
}
) {
split_usd: sum(
of: Settlement_Amounts_CollateralAmountInUSD
if: { Settlement: { EventType: { is: "Split" } } }
)
merge_usd: sum(
of: Settlement_Amounts_CollateralAmountInUSD
if: { Settlement: { EventType: { is: "Merge" } } }
)
net_split_merge_usd: calculate(expression: "$split_usd - $merge_usd")
}
}
}

Variables (example):

{
"day": "2026-03-22"
}

Top markets by volume: last 24 hours​

Rank Polymarket markets by buy + sell collateral USD, with buy/sell breakdown, trade count, distinct buyers/sellers, and optional resolution join. Uses limitBy: Trade_Prediction_Question_Id so each row is one market.

Run in Bitquery IDE

query topMarketsByVolume($limit: Int!) {
EVM(network: matic) {
PredictionTrades(
where: { Block: { Time: { since_relative: { hours_ago: 24 } } } }
limitBy: { count: 1, by: Trade_Prediction_Question_Id }
limit: { count: $limit }
orderBy: { descendingByField: "sumBuyAndSell" }
) {
Trade {
Prediction {
Question {
Id
Image
Title
CreatedAt
}
OutcomeToken {
assetId0: AssetId(
if: { Trade: { Prediction: { Outcome: { Index: { eq: 0 } } } } }
)
assetId1: AssetId(
if: { Trade: { Prediction: { Outcome: { Index: { eq: 1 } } } } }
)
}
Outcome {
label0: Label(
if: { Trade: { Prediction: { Outcome: { Index: { eq: 0 } } } } }
)
label1: Label(
if: { Trade: { Prediction: { Outcome: { Index: { eq: 1 } } } } }
)
}
}
OutcomeTrade {
price0: Price(
maximum: Block_Time
if: { Trade: { Prediction: { Outcome: { Index: { eq: 0 } } } } }
)
price1: Price(
maximum: Block_Time
if: { Trade: { Prediction: { Outcome: { Index: { eq: 1 } } } } }
)
}
}
buyUSD: sum(
of: Trade_OutcomeTrade_CollateralAmountInUSD
if: { Trade: { OutcomeTrade: { IsOutcomeBuy: true } } }
)
sellUSD: sum(
of: Trade_OutcomeTrade_CollateralAmountInUSD
if: { Trade: { OutcomeTrade: { IsOutcomeBuy: false } } }
)
sumBuyAndSell: calculate(expression: "$buyUSD + $sellUSD")
trades: count
buyers: count(distinct: Trade_OutcomeTrade_Buyer)
sellers: count(distinct: Trade_OutcomeTrade_Seller)
resolved: joinPredictionManagements(
join: left
Management_Prediction_Question_Id: Trade_Prediction_Question_Id
) {
Block {
Time(
maximum: Block_Time
if: { Management: { EventType: { is: "Resolved" } } }
)
}
}
}
}
}

Variables (example):

{
"limit": 100
}

NeedDoc
Trades, prices, filtersPrediction Trades API
Splits, merges, redemptionsPrediction Settlements API
Condition ID, slug, tokenPolymarket Markets API
OverviewPolymarket API
Wallet-level activityWallet & User Activity API
Token balances (USDC)Token Balance API

Support​

Build with Bitquery

Ready to run this in production?

Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.