Rewards & Affiliation
Leaderboards

Leaderboards

Superhero has one leaderboard: the Trading Leaderboard at https://superhero.com/trends/leaderboard. It ranks wallets by on-chain trading performance over a window you choose.

There is no separate creator, referrer or reward leaderboard. Affiliate earnings and rewards-program payouts do not appear here.

Metrics

Pick one metric at a time from the Sort by control. It maps directly to the sortBy query parameter.

MetricParameterWhat it measuresSort direction
PnLpnlProfit and loss over the window, in USDDescending: highest first
ROIroiReturn on invested capital over the window, as a percentageDescending
AUMaumAssets under management: current portfolio value, in USDDescending
MDDmddMaximum drawdown over the window, as a percentageAscending: smallest drawdown first

MDD is the one inversion: a small maximum drawdown is a good result, so the app sends sortDir=ASC for that metric and DESC for the other three. If you call the endpoint directly, do the same.

ROI is computed differently for the fixed windows and for All:

7d and 30d
  pnl_usd = AUM at the end of the window − AUM at the start
  roi_pct = pnl_usd / AUM at the start × 100          (0 if the start AUM is 0)

all
  pnl_usd = total all-time gain, in USD
  roi_pct = total all-time gain / total all-time cost basis × 100
            falling back to the same ratio in AE if the USD cost basis is 0,
            and to 0 if both are

The 7d and 30d boards measure portfolio growth, which a deposit inflates and a withdrawal deflates. The All board measures return on invested capital. A wallet can rank very differently on each.

For the All window, the window-based figures (the sparkline, the maximum drawdown, and the buy and sell counts) cover the last 365 days. Only PnL and ROI are all-time.

Timeframes

ControlSent asSparkline points
7Dwindow=7dpoints=7
30Dwindow=30dpoints=30
Allwindow=allpoints=30
Custom rangestartDate and endDate, ISO-8601Not sent

Custom ranges are entered as dd/mm/yyyy hh:mm in local time and converted to ISO-8601 before the request. Both ends are required; a start after the end is rejected in the client, and an unparseable date disables the query. When a custom range is applied, window and points are omitted.

What each row shows

FieldShown as
address, chain_nameThe wallet, with its .chain name if it has one
pnl_usdPnL for the timeframe, in USD
roi_pctROI for the timeframe
aum_usdAUM, labelled "Latest portfolio value"
mdd_pctMaximum drawdown for the timeframe
buy_count, sell_countBuys and sells
created_tokens_countTokens this account created
owned_trends_countOwned trends
portfolio_value_usd_sparklineThe inline sparkline, an array of point pairs
volume_usdPresent in the response; not rendered on the card

Rank is computed client-side from the page offset ((page − 1) × 15 + index + 1), so it is the rank within the currently selected metric and window.

For a custom range, created_tokens_count and owned_trends_count are always zero, while volume_usd is populated: the reverse of the fixed windows.

Who appears

The board is not a ranking of everybody. The snapshot job takes the top 100 addresses by all-time USD traded volume, then ranks only those 100 by whichever metric you chose. Volume is therefore an implicit qualifier for every metric: a wallet with an outstanding ROI but modest lifetime volume never enters the pool.

A second filter applies on read: minAumUsd defaults to 1, excluding rows whose AUM is below one US dollar. Pass minAumUsd=0 to include them.

Custom ranges bypass the snapshot and compute live. The candidate pool is then the top addresses by USD volume of buy and sell transactions inside that range rather than all-time, sized by maxCandidates, default 100, maximum 500.

Which trades count

Bonding-curve trades only: buy, sell and create_community calls on community token sales. DEX swaps, liquidity provision and plain AE transfers are not counted, either for the volume ranking that decides who is a candidate or for the buy_count and sell_count on each card. Portfolio value is whatever the account's holdings are worth, so AUM and the sparkline can move for reasons the buy and sell counts never show.

tradingOnly=true narrows it further, for custom ranges only: it switches the selected-period PnL and ROI to realised token-trading PnL and cost basis, excluding portfolio value changes caused by transfers.

The endpoint

GET /api/accounts/leaderboard

Base URL is Superhero's API: https://api.superhero.com on mainnet.

ParameterValues
sortBypnl, roi, aum, mdd. Default pnl.
sortDirASC or DESC. Defaults to DESC, except sortBy=mdd which defaults to ASC.
window7d, 30d, all. Default 7d.
pointsNumber of sparkline points. Ignored for window requests: the snapshot fixes it at 8 for 7d, 12 for 30d and 24 for all. For a custom range it is clamped to 2–12, default 8.
startDate, endDateISO-8601, both required together, end after start. Switches to the live path; mutually exclusive with window.
minAumUsdInteger, 0 or more. Defaults to 1, which excludes near-zero portfolios.
tradingOnlyBoolean. Custom ranges only: bases PnL and ROI on realised trading PnL rather than portfolio value change.
page1-based. Default 1.
limitPage size, 1–50. Server default 18; the UI sends 15.
maxCandidatesIgnored for window requests. For a custom range it sizes the live candidate pool, default 100, maximum 500.

The response is the standard paginated envelope: an items array of the fields above, plus a meta object carrying page, limit, totalItems, totalPages, window, sortBy, sortDir and a timeFilter block with the resolved value, unit, start and end.

curl "https://api.superhero.com/api/accounts/leaderboard?sortBy=pnl&sortDir=DESC&window=7d&points=7&page=1&limit=15"

The inverted case for drawdown:

curl "https://api.superhero.com/api/accounts/leaderboard?sortBy=mdd&sortDir=ASC&window=30d&points=30&page=1&limit=15"

Freshness

Server side, a snapshot job runs every 10 minutes and recomputes all three windows in sequence (7d, then 30d, then all) against a single reference timestamp captured at the start of the run. Each window's rows are replaced inside one transaction, so a read never sees a half-built board. A run still going when the next tick fires is skipped rather than queued.

Every window request is served from that snapshot, so the figures are up to about ten minutes behind the chain, plus whatever lag the PnL and price data carry. Custom ranges compute live on the request, which is why they are slower.

Client side, the app caches each metric-and-window combination for 60 seconds and keeps fetched windows in memory for 5 minutes; switching metrics or pages within those windows is served from cache.

How to climb it

  • Trade trend tokens regularly to build up volume. The top 100 by lifetime USD volume is the entry condition for every metric.
  • Keep PnL and ROI positive over time.
  • Own and hold trending tokens to grow AUM.

Trading costs the 1% spread on every round trip, so volume bought purely to chase a leaderboard place is a certain cost against an uncertain ranking.

Related