Polymarket’s data-api exposes a per-category leaderboard that the UI uses but isn’t widely documented. It accepts only 9 fixed category slugs, is case-insensitive, and lets you pull the top PNL/VOL traders for a specific category (e.g. weather, crypto). Durable external-API fact, verified live 2026-06-05.

For Agents

GET https://data-api.polymarket.com/v1/leaderboard
    ?timePeriod=month        # day | week | month | all  (case-insensitive)
    &orderBy=PNL             # PNL | VOL
    &category=<slug>         # one of the 9 below, or OVERALL (case-insensitive)
    &limit=N
    &offset=0

Also: GET https://data-api.polymarket.com/v1/biggest-winners?...&category=<slug>.

The 9 valid categories (only these)

politics, sports, crypto, finance, culture, mentions, economics, weather, tech

Arbitrary gamma tags do NOT work

The category param accepts only the 9 fixed leaderboard categories above (plus OVERALL for the global board). Passing an arbitrary gamma tag — iran, elections, geopolitics, etc. — returns empty or the global board, not a filtered slice. This is a different namespace from gamma event_tags (see pmv2-gamma-tags-categorization), and the two don’t map 1:1 — see the mismatches in category-consensus.

Param semantics

  • category is case-insensitivecategory=WEATHER and category=OVERALL both work; so does lowercase.
  • timePeriod is case-insensitivemonth and MONTH both work. Values: day, week, month, all.
  • orderBy{PNL, VOL}.

Verified live (2026-06-05)

categorytop trader(s)~PNL
weatherShyGuy1 / HighTempTation~$5k
cryptostrike123$467k
OVERALL (global)Inaccuratestake$1.36M

How it was found

By inspecting the Polymarket UI’s /leaderboard page — the “All Categories” dropdown drives the route /leaderboard/{category}/{window}/{metric}, which fans out to the data-api category= param above.

Code state — already wired (no bug)

The polymarket_data Category enum (types.rs) ALREADY contains all 9 categories + Overall, and leaderboard() already sends category = params.category.as_query_value() (which renders UPPERCASE, e.g. OVERALL). pmv2’s cohort fetch uses Category::Overall (the global board).

FALSE ALARM — the uppercase category is NOT a bug

A code reviewer flagged the UPPERCASE as_query_value() as a “lowercase bug.” It is not a bug: the API is case-insensitive, and production already runs with category=OVERALL (uppercase) successfully. Do not “fix” this to lowercase — it changes nothing and risks churn on a working prod path.