---
title: "List trending wallets"
method: GET
path: "/api/v1/leaderboard/trending"
tags: ["Leaderboard"]
---

# List trending wallets

`GET /api/v1/leaderboard/trending`

Returns wallets ranked by trailing-window realized P&L (Polymarket-only discovery), with opaque page-cursor pagination. Each row carries window P&L, volume, distinct markets, grade, hot-streak tier, and a zero-filled daily P&L series. The underlying read model is warmed into Redis; a cold read returns 503 (warming, retry-after), never a 500 or a fabricated ranking. Polymarket-only: the read model filters platform = 'polymarket'.

## Query parameters

- `limit` integer
- `cursor` string
- `window` '7d' | '30d'

## Response `200`

Trending wallets list

- object
  - `object` 'list', required
  - `data` TrendingWallet[], required
    - `id` string, required — Prefixed trader ID (`trd_...`).
    - `address` string, required
    - `rank` integer, required — 1-based rank within the full ranked set (stable across pages).
    - `username` string, nullable
    - `profile_image_url` string, nullable — Official Polymarket avatar URL (profileImage).
    - `platform` 'polymarket' | 'kalshi', required — Real provider platform; surfaced, never coerced. Polymarket-only today.
    - `trending_pnl_usd` number, required — Realized P&L over the trailing window in USD (ranking axis).
    - `window_volume_usd` number, required
    - `window_markets_traded` integer, required
    - `window_trade_days` integer, required
    - `grade` 'S' | 'A' | 'B' | 'C' | 'D' | 'F' — All-time cohort-relative skill grade (forecasting calibration, risk-adjusted returns, consistency); a separate axis from streak_tier. Not a profit ranking, and relative, so it drifts as the cohort moves. Omitted when the trader is Unranked (fewer than 5 markets, insufficient track record to cohort-rank).
    - `streak_tier` 'hot' | 'rising' | 'neutral' | 'cooling' | 'cold', nullable — Hot-streak tier (trailing-7d cross-sectional percentile). Null when no recent activity.
    - `all_time_pnl_usd` number, nullable
    - `all_time_score` number, nullable
    - `last_synced` string, date-time, nullable
    - `daily_pnl_series` object[], required — Zero-filled daily P&L series across the window.
      - `date` string, date, required
      - `pnl_usd` number, required
  - `has_more` boolean, required
  - `next_cursor` string, nullable — Opaque cursor for the next page; absent on the last page.
  - `total` integer, nullable — Total ranked rows when the read model exposes a count; may be absent.
  - `meta` ResponseMeta, required
    - `request_id` string, required — Unique request ID (req_ prefix).
    - `cached` boolean, required
    - `cache_age_s` integer, nullable — Cache age in seconds, null if not cached.

## Other responses

- `304` — Not Modified. Returned when If-None-Match matches the current payload.
- `400` — Invalid request parameter
- `401` — Missing or invalid API key
- `402` — Active Insider subscription required
- `403` — Account access denied
- `408` — Request exceeded the server's 30-second transport timeout. The timeout response has an empty body because it is generated before handler-level JSON error shaping.
- `423` — Account is locked
- `429` — Rate limit exceeded (100 req/min; batch endpoints also reserve 100 batch item units/min before execution)
- `503` — Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown

## Changes

- **2026-06-15** `5b6d6ff7692c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/0xinsider/apis/0xinsider-api/changes/api/v1/leaderboard/trending/get.md)

---

[API](https://skmtc.dev/0xinsider/apis/0xinsider-api.md) · [All operations](https://skmtc.dev/0xinsider/apis/0xinsider-api/llms.txt) · [OpenAPI document](https://skmtc.dev/0xinsider/apis/0xinsider-api/revisions/137fa0fd3297?raw)
