REST API

Polymarket Analytics

Bounded Polymarket leaderboard, trader profile, positions, market summary, and user category endpoints.

Weight: Fixed per request, depending on endpoint | Advanced-tier only

These endpoints expose Polymarket-specific analytics that are not served through /v1/points. They are fixed-weight GET endpoints under /v1/polymarket/analytics/*, and they do not use the usual point-based weight formula. All examples use the standard public auth header:

Header
-H "X-Kiyotaka-Key: YOUR_API_KEY"

Common behavior

RuleDetails
Tier accessAdvanced-tier only
Weight modelFixed per endpoint
HTTP methodGET
Paginationlimit defaults to 20, offset defaults to 0
Pagination boundslimit <= 100, offset <= 100
StreamingNot available on WebSocket

These endpoints are separate from /v1/points. They do not use type, exchange, interval, from, or period.

Top-level JSON fields are camelCase (traderProfiles, traderProfile, userPositions, marketSummary, userCategories). Nested Polymarket payload fields remain snake_case.

The JSON response can omit fields whose values are zero, empty, or unset. The response tables below list the available fields even when a specific response sample does not include every field. Long distribution arrays are shortened in the examples.

Endpoint overview

EndpointWeightPurpose
/v1/polymarket/analytics/leaderboard60Browse trader leaderboard results with bounded filters and sorting
/v1/polymarket/analytics/trader-profile100Fetch a single trader profile for one wallet
/v1/polymarket/analytics/positions40Fetch bounded position rows by wallet, asset, or condition
/v1/polymarket/analytics/market-summary60Fetch a market summary for exactly one assetId or conditionId
/v1/polymarket/analytics/user-categories40Fetch a trader's category breakdown for one wallet

When the target is a known market rather than a specific outcome token, prefer conditionId.

Leaderboard

GET/v1/polymarket/analytics/leaderboard

Returns a bounded list of trader profiles. By default it sorts by realized PnL descending.

Parameters

ParameterTypeRequiredDescription
limitint32NoNumber of rows to return. Default: 20. Max: 100.
offsetint32NoZero-based pagination offset. Default: 0. Max: 100.
roiPercentageint64NoMinimum realized ROI percentage.
minTotalTradeCountdoubleNoMinimum total position count.
maxTotalTradeCountdoubleNoMaximum total position count.
winRatedoubleNoMinimum win rate percentage.
avgPositionSizedoubleNoMinimum average position size.
totalVolumedoubleNoMinimum total traded size.
primaryCategorystringNoFilter to traders who have traded a category, for example Politics.
openPositionCountint64NoMinimum number of open positions.
timeSinceLastTradeint64NoMinimum seconds since the latest trade.
avgHoldingTimeint64NoMinimum average holding duration in seconds.
sortByenumNoREALIZED_PNL, ROI, WIN_COUNT, WIN_RATE, TOTAL_SIZE, or TOTAL_POSITION_COUNT.
sortDirectionenumNoSORT_DIRECTION_ASC or SORT_DIRECTION_DESC.

Response fields

Each entry in traderProfiles is a PolymarketTraderProfile:

FieldTypeDescription
wallet_addressstringTrader wallet address
total_position_countint64Total number of tracked positions
open_position_countint64Number of currently open positions
closed_position_countint64Number of closed positions
latest_open_position_tsobjectLatest open position timestamp, with seconds and nanoseconds
total_sizedoubleTotal tracked position size
total_realized_pnldoubleTotal realized PnL
total_unrealized_pnldoubleTotal unrealized PnL
total_roidoubleTotal return on investment
win_rate_by_positionsdoubleWin rate by closed positions
largest_windoubleLargest realized win
largest_lossdoubleLargest realized loss
avg_holding_durationint64Average holding duration in seconds
total_open_pos_valuedoubleTotal value of open positions
total_closed_pos_valuedoubleTotal value of closed positions

Example

cURL
curl "https://api.kiyotaka.ai/v1/polymarket/analytics/leaderboard?limit=1" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"
JSON
{
  "traderProfiles": [
    {
      "wallet_address": "0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab",
      "total_position_count": 1047,
      "closed_position_count": 1047,
      "total_size": 193273897.17371872,
      "total_realized_pnl": 94916520.2155992,
      "win_rate_by_positions": 80.70678127984718,
      "largest_win": 5740012.643231001,
      "largest_loss": -48.26,
      "avg_holding_duration": 3429946,
      "total_closed_pos_value": 193273897.17371872
    }
  ]
}

Trader Profile

GET/v1/polymarket/analytics/trader-profile

Returns a single trader profile for exactly one wallet.

Parameters

ParameterTypeRequiredDescription
userWalletstringYesWallet address, for example 0x...

Response

The response contains a single traderProfile object with the same shape as leaderboard rows.

cURL
curl "https://api.kiyotaka.ai/v1/polymarket/analytics/trader-profile?userWallet=0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"
JSON
{
  "traderProfile": {
    "wallet_address": "0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab",
    "total_position_count": 1047,
    "closed_position_count": 1047,
    "total_size": 193273897.17371872,
    "total_realized_pnl": 94916520.2155992,
    "win_rate_by_positions": 80.70678127984718,
    "largest_win": 5740012.643231001,
    "largest_loss": -48.26,
    "avg_holding_duration": 3429946,
    "total_closed_pos_value": 193273897.17371872
  }
}

Positions

GET/v1/polymarket/analytics/positions

Returns bounded position rows for one wallet, one asset, or one market condition.

Parameters

ParameterTypeRequiredDescription
userWalletstringNoWallet address. Can be used alone or together with one identifier.
assetIdstringNoOutcome token identifier. Mutually exclusive with conditionId.
conditionIdstringNoMarket condition identifier. Mutually exclusive with assetId.
limitint32NoNumber of rows to return. Default: 20. Max: 100.
offsetint32NoZero-based pagination offset. Default: 0. Max: 100.

Valid request shapes

  • userWallet=<wallet>
  • userWallet=<wallet>&assetId=<asset_id>
  • userWallet=<wallet>&conditionId=<condition_id>
  • assetId=<asset_id>
  • conditionId=<condition_id> At least one of userWallet, assetId, or conditionId is required. assetId and conditionId cannot be set together.

Response fields

Each entry in userPositions is a PolymarketUserPositions row:

FieldTypeDescription
wallet_addressstringTrader wallet address
asset_idstringOutcome token identifier
unrealized_sizedoubleCurrently unrealized position size
realized_sizedoubleRealized position size
avg_pricedoubleAverage entry price
avg_exit_pricedoubleAverage exit price
realized_pnldoubleRealized PnL
resolved_pricedoubleFinal resolved price, when available
latest_open_tsint64Latest open timestamp
prev_hold_durationint64Previous holding duration in seconds
buy_countint32Number of buy events
sell_countint32Number of sell events
split_countint32Number of split events
merge_countint32Number of merge events
transfer_in_countint32Number of inbound transfer events
transfer_out_countint32Number of outbound transfer events
conversion_in_countint32Number of inbound conversion events
conversion_out_countint32Number of outbound conversion events
market_namestringMarket title
outcome_namestringOutcome label
categorystringMarket category
sub_categorystringMarket sub-category
condition_idstringMarket condition identifier

Example

cURL
curl "https://api.kiyotaka.ai/v1/polymarket/analytics/positions?userWallet=0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab&limit=1" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"
JSON
{
  "userPositions": [
    {
      "wallet_address": "0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab",
      "asset_id": "69984203794322070924779554468751071533998686576952069110752844084141678897886",
      "realized_size": 11555027.501624001,
      "avg_exit_price": 0.49675456353732356,
      "realized_pnl": 5740012.643231001,
      "resolved_price": 1,
      "prev_hold_duration": 14305671,
      "merge_count": 153,
      "transfer_in_count": 383,
      "transfer_out_count": 24,
      "market_name": "Which party will control the U.S. Senate after the 2022 election?",
      "outcome_name": "Democratic",
      "category": "Politics",
      "sub_category": "US Politics",
      "condition_id": "0xe0658c4beed2102c181b3987edff5edd578ad2952a6eb5fa8018925e5d7a48fd"
    }
  ]
}

Market Summary

GET/v1/polymarket/analytics/market-summary

Returns a market summary for exactly one assetId or one conditionId.

Parameters

ParameterTypeRequiredDescription
assetIdstringNoOutcome token identifier
conditionIdstringNoMarket condition identifier

Exactly one of assetId or conditionId is required.

Response fields

The response contains a single marketSummary object:

FieldTypeDescription
event_idstringPolymarket event identifier
condition_idstring[]Condition IDs included in the summary
total_open_positionsint32Open position count
total_closed_positionsint32Closed position count
total_cost_basisdoubleTotal cost basis
total_sizedoubleTotal traded size
largest_open_positiondoubleLargest open position size
total_buy_countint32Total buy event count
total_sell_countint32Total sell event count
total_split_countint32Total split event count
total_merge_countint32Total merge event count
total_transfer_in_countint32Total inbound transfer event count
total_transfer_out_countint32Total outbound transfer event count
total_conversion_in_countint32Total inbound conversion event count
total_conversion_out_countint32Total outbound conversion event count
net_transfer_flowint32Net transfer flow count
net_conversion_flowint32Net conversion flow count
median_hold_durationdoubleMedian holding duration in seconds
mean_hold_durationdoubleMean holding duration in seconds
realized_pnl_mindoubleMinimum realized PnL
realized_pnl_maxdoubleMaximum realized PnL
realized_pnl_distributiondouble[]Realized PnL percentile values from p0 to p99
win_ratedoubleWin rate for the summarized market
avg_buy_countdoubleAverage buy event count
avg_sell_countdoubleAverage sell event count
avg_sizedoubleAverage position size
outcome_pricingobject[]Per-outcome token pricing rows

Each row in outcome_pricing includes:

FieldTypeDescription
condition_idstringMarket condition identifier
token_idstringOutcome token identifier
outcome_namestringOutcome label
weighted_avg_entry_pricedoubleWeighted average entry price
weighted_avg_exit_pricedoubleWeighted average exit price
open_pos_avg_price_distributiondouble[]101 buckets; index i is the account count with average entry price in [i, i+1) cents
closed_pos_avg_exit_price_distributiondouble[]101 buckets; index i is the account count with average exit price in [i, i+1) cents

Example

cURL
curl "https://api.kiyotaka.ai/v1/polymarket/analytics/market-summary?assetId=69984203794322070924779554468751071533998686576952069110752844084141678897886" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"
JSON
{
  "marketSummary": {
    "event_id": "3506",
    "condition_id": [
      "0xe0658c4beed2102c181b3987edff5edd578ad2952a6eb5fa8018925e5d7a48fd"
    ],
    "total_open_positions": 12,
    "total_closed_positions": 934,
    "total_cost_basis": 3287751.5362184998,
    "total_size": 13278317.319730995,
    "largest_open_position": 6517160.129311998,
    "total_split_count": 10516,
    "total_merge_count": 6370,
    "total_transfer_in_count": 10523,
    "total_transfer_out_count": 10523,
    "median_hold_duration": 19340026,
    "mean_hold_duration": 15813372.224219989,
    "realized_pnl_min": -7865106.637885602,
    "realized_pnl_max": 5740012.643231001,
    "realized_pnl_distribution": [
      -7865106.637885602,
      -0.00046407000000012324,
      0,
      74042.54808002156
    ],
    "win_rate": 0.5288259958071279,
    "avg_size": 48280.608293311605,
    "outcome_pricing": [
      {
        "condition_id": "0xe0658c4beed2102c181b3987edff5edd578ad2952a6eb5fa8018925e5d7a48fd",
        "token_id": "111299642775108135148113523472260651188510255643046337855221699185339755388694",
        "outcome_name": "Republican",
        "weighted_avg_entry_price": 0.000005283318038929714,
        "weighted_avg_exit_price": 0.1733132532287334,
        "open_pos_avg_price_distribution": [10, 0, 0, 3],
        "closed_pos_avg_exit_price_distribution": [872, 1, 2, 24]
      }
    ]
  }
}

User Categories

GET/v1/polymarket/analytics/user-categories

Returns a category breakdown for exactly one wallet.

Parameters

ParameterTypeRequiredDescription
userWalletstringYesWallet address, for example 0x...

Response fields

The response contains a single userCategories object:

FieldTypeDescription
wallet_addressstringTrader wallet address
category_breakdownobject[]Category-level breakdown rows

Each row in category_breakdown includes:

FieldTypeDescription
market_categorystringTop-level category name
market_sub_categorystringSub-category name
countint64Number of positions in that category
realized_sizedoubleRealized traded size
unrealized_sizedoubleUnrealized size
realized_pnldoubleRealized PnL for that category

Example

cURL
curl "https://api.kiyotaka.ai/v1/polymarket/analytics/user-categories?userWallet=0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"
JSON
{
  "userCategories": {
    "wallet_address": "0xf1302aafc43aa3a69bcd8058fc7a0259dac246ab",
    "category_breakdown": [
      {
        "market_category": "Politics",
        "market_sub_category": "US Politics",
        "count": 248,
        "realized_size": 114739709.61980493,
        "realized_pnl": 56646616.73381202
      }
    ]
  }
}

Typical workflows

Common starting points fall into two categories:

  • inspect a trader
  • inspect a market Choose the workflow that matches the task. Not every endpoint needs to be called in sequence.

Start from a trader

Use this flow to discover a wallet first, then inspect that trader's profile, category mix, and positions.

  1. Call /leaderboard with a small limit to get a wallet.
  2. Extract traderProfiles[0].wallet_address.
  3. Reuse that wallet with /trader-profile, /user-categories, or /positions.
  4. For market-level context on one returned position, extract condition_id from /positions and call /market-summary.
Bash
WALLET=$(curl -s "https://api.kiyotaka.ai/v1/polymarket/analytics/leaderboard?limit=1" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY" | jq -r '.traderProfiles[0].wallet_address')


curl "https://api.kiyotaka.ai/v1/polymarket/analytics/trader-profile?userWallet=\${WALLET}" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"


curl "https://api.kiyotaka.ai/v1/polymarket/analytics/user-categories?userWallet=\${WALLET}" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"


CONDITION_ID=$(curl -s "https://api.kiyotaka.ai/v1/polymarket/analytics/positions?userWallet=\${WALLET}&limit=1" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY" | jq -r '.userPositions[0].condition_id')


curl "https://api.kiyotaka.ai/v1/polymarket/analytics/market-summary?conditionId=\${CONDITION_ID}" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"

Start from a market

Use this flow when the market is already known and a conditionId is available.

  1. Start with a conditionId.
  2. Call /market-summary with that conditionId.
  3. Optionally call /positions?conditionId=... to inspect position rows for that market. The example below uses the same conditionId shown in the /positions example above, so the commands can be run directly.
Bash
CONDITION_ID="0xe0658c4beed2102c181b3987edff5edd578ad2952a6eb5fa8018925e5d7a48fd"


curl "https://api.kiyotaka.ai/v1/polymarket/analytics/market-summary?conditionId=\${CONDITION_ID}" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"


curl "https://api.kiyotaka.ai/v1/polymarket/analytics/positions?conditionId=\${CONDITION_ID}&limit=5" \\
  -H "X-Kiyotaka-Key: YOUR_API_KEY"

These examples use jq to extract identifiers from JSON. Without jq, extract traderProfiles[0].wallet_address or userPositions[0].condition_id from the responses and reuse those values manually.

Monitor weight consumption with GET /v1/usage, and see the Rate Limits page for the response headers and quota model.