Get a ranked list of Polymarket wallets
/v1/pm/leaderboards/{board}Call this to list the top wallets of one board: pnl (net profit), volume (USDC volume) or skill (the lower bound of the forecasting edge, rated wallets only). data.rows holds rank, wallet, fills, markets, volume, realized, final, wash_share and skill (null unless the wallet is rated). total is the size of the whole board. limit is 1 to 100 (default 50) and offset 0 to 10000 (default 0), and the first row of a page has the rank offset + 1.
Every answer carries data.coverage, which says the history ends at Polygon block 85,948,288 (2026-04-24 07:43:40 UTC), names the source (Envio's public Polymarket dataset, licence CC BY 4.0) and holds the attribution line and the modified notice. Keep both wherever you show the data. meta.as_of["eip155:137"] repeats the last block, and meta.finality is finalized. Polygon is not a chain Sona serves, so the route has no {chain}.
Other venues. With venue=hyperliquid the boards are pnl, volume and skill over the HIP-4 wallets, where skill ranks the rated wallets by edge_lb. With venue=levr the boards are pnl (realized profit) and volume (size of the positions opened); Levr has no skill board, and skill answers 400 invalid_query. kalshi and polymarket-us have no trader ids and answer 400 invalid_query.
Venues. A venue other than polymarket is read from what Sona's collector recorded, so its answer has no block: meta.finality is none, meta.as_of is empty and no Sona-* header is sent. An answer for Levr Bet would be labelled eip155:143, the chain it runs on, if it ever carried a block. Every venue answer has its own data.coverage object (venue, since, last_ok, mode, wallets, gaps, note) in place of the Polymarket one, and says in note what is not recorded. Answers for a venue are kept for 30 seconds, and a stale one for 5 seconds. An unknown venue, or one the route cannot serve, is pm-api's 400 invalid_query, passed through. While the recorded data cannot be read a venue answer is 503 upstream_unavailable with Retry-After: 1.
Path parameters
| Name | Type | Description |
|---|---|---|
boardRequired | string | Which board to read: |
Query parameters
| Name | Type | Description |
|---|---|---|
limit | integerDefault 50 | The most rows to return, from 1 to 100. Anything else answers 400 |
offset | integerDefault 0 | How many rows to skip, from 0 to 10000. A value past the end of the board gives an empty page. Anything that is not a whole number in that range answers 400 |
venue | stringDefault polymarket | Which venue to read: |
Response
The answer, wrapped in the {data, meta, links} envelope.
| Field | Type | Description |
|---|---|---|
| board | string | Which board this is. |
| coverage | object | What period the Polymarket data covers, where it comes from and the notices that must be shown with it. |
| kind | string | Always |
| limit | integer | The page size that was used. |
| offset | integer | The rows that were skipped. |
| rows | array of objects | The page, best first. |
| total | integer | The rows on the whole board. |
| Field | Type | Description |
|---|---|---|
| board | string | Which board this page is from. |
| coverage | object | What a recorded venue holds, from when, and how complete it is. It replaces the Polymarket |
| kind | string | Always |
| limit | integer | The page size that was used. |
| offset | integer | The rows that were skipped. |
| rows | array of objects | The page in rank order, empty past the end of the board. |
| total | integer | The wallets on the board: all wallets for |
| venue | string | Always |
| Field | Type | Description |
|---|---|---|
| board | string | Which board this page is from. |
| coverage | object | What a recorded venue holds, from when, and how complete it is. It replaces the Polymarket |
| kind | string | Always |
| limit | integer | The page size that was used. |
| offset | integer | The rows that were skipped. |
| rows | array of objects | The page in rank order, empty past the end of the board. |
| total | integer | The wallets on the board. |
| venue | string | Always |
Cost
1 credit. The time limit is 5 seconds.
Errors
| Status | Code |
|---|---|
| 400 | invalid_idinvalid_query |
| 429 | rate_limitedcredits_exhausted |
| 500 | internal |
| 503 | upstream_unavailable |
| 504 | deadline_exceeded |
400 invalid_id for a board other than pnl, volume or skill, 400 invalid_query for a bad limit or offset, a venue that has no boards or any other query key, 429 rate_limited or credits_exhausted, 503 upstream_unavailable while the dataset is not loaded, and 504 deadline_exceeded when the budget runs out.