API reference

Rankings

One endpoint backs every list on the front end. Sorts and filters are orthogonal, so anything can be ranked within any subset, and the one ranking that cannot be computed refuses rather than returning something misleading.

Sorts#

by selects the sort column, descending, with nulls last and the mint address as a stable tiebreak. The default is newest. An unrecognised value returns 400 with the valid list in the message.

bySorts onMeans
newestcreated_atmost recently launched first. The default.
profitprofit_sweptmost profit swept out of the bankroll
feesfees_claimedmost quote fees claimed
boughtBackpaid_to_holdersmost quote spent buying the token back
burnedtokens_burnedmost supply destroyed
paysHoldersprofit_to_holders_bpslargest holders' share of profit, which funds the buyback
activePositionsopen_positions_countmost Remote venue accounts with a non-zero attested equity
marketCapnothingnot implemented, see below

Every sort key is an indexed column or a cheap indexed-subquery count, never a full scan.

The sort that refuses#

by=marketCap returns 200 with a body that says it is unavailable and why, rather than returning an empty list or quietly sorting by something else.

GET /rankings?by=marketCap
{
  "by": "marketCap",
  "available": false,
  "reason": "live per-token market cap requires reading the launched token's LaunchLab/CPMM pool account directly on chain. The bankroll program's events and StonkFun's public API (opening/graduation market cap of the QUOTE, at launch time only) do not carry this. Not implemented by this indexer yet.",
  "rows": []
}

Individual rows still carry a market cap

Every row's marketCap object is populated when the policy's LaunchLab pool is on its bonding curve. What is missing is the ordering, because sorting needs the figure for every policy and it is absent for graduated ones.

Filters#

All seven combine freely with any sort, and the response echoes the parsed values back under filters so a client can see exactly what was applied.

ParameterTypeMatches
quoteMintaddresspolicies quoted in one stock
modePassive or Agentexact string match on the mode column
modelintegerexact model_id
riskMinintegerrisk at or above
riskMaxintegerrisk at or below
lockedbooleantrue, 1, false or 0. Anything else parses as no filter.
hasOpenPositionsbooleantrue means at least one Remote venue with non-zero attested equity; false means none
rankings by burned, Agent mode only, risk 80 and above
GET /rankings?by=burned&mode=Agent&riskMin=80&limit=10
the echoed filter block
{
  "by": "newest",
  "filters": {
    "quoteMint": null, "mode": null, "model": null,
    "riskMin": null, "riskMax": null, "locked": null, "hasOpenPositions": null
  },
  "source": "chain: policies table (Policy account snapshot + counted VenueAccount attestations)",
  "limit": 50,
  "offset": 0,
  "rows": [ ... ]
}

Pagination#

ParameterDefaultRangeOut of range
limit501 to 200clamped
offset00 to 100000clamped

An unparseable value falls back to the default rather than erroring. The values actually used are echoed in the response.

The row shape#

one ranking row
{
  "mint": "AUCgvtVBJNRaZXAqGuhRM8smJoqtXtNhiRzJ9m7zkL4x",
  "quoteMint": "7Gm5YPpxNuTihtRhsghDsy5Vp3zgyP4KZTDTw4dZEUqV",
  "quoteSymbol": null, "quoteName": null, "quoteDecimals": 8,
  "quoteSymbolSource": null, "quoteIconUrl": null, "quoteIconSource": null,
  "marketCap": { "quote": { "...": "figure" }, "usd": { "...": "figure" },
                 "priceQuotePerBase": null,
                 "pool": "6taTbZGQsTvazUEWQYwkc6J4a8pZZHQPsiPVNVf1TyQH",
                 "poolStatus": null },
  "mintName": null, "mintSymbol": null, "mintImageUrl": null,
  "mode": "Agent", "modelId": 5, "modelName": "Claude Opus 5",
  "risk": 80, "locked": false, "paused": false,
  "targetAsset": "57houCUPYrnJ1VCGDqTBLaEpE3ZpQUkNzRcY72igLryJ",
  "targetLeverageX": 5,
  "feesClaimed": "0", "protocolFees": "0", "routedToLp": "0", "routedToBankroll": "0",
  "profitSwept": "0", "paidToHolders": "0", "tokensBurned": "0", "creditSpent": "0",
  "paysHolders": true,
  "openPositionsCount": 0,
  "createdAt": "2026-09-23T01:34:04.000Z",
  "updatedAt": "2026-09-23T01:34:12.766Z"
}

Counters here are bare strings, not figures

A ranking row serves its counters as plain decimal strings rather than wrapped in the { value, source, asOf } envelope, because the row-level source covers all of them at once. The base units and the meaning are identical to the coin resource.

Two fields worth reading carefully#

A row carries two different symbols#

quoteSymbol is the stock the launch is priced in. mintSymbol is the launched token's own symbol, from its Token-2022 metadata. They are deliberately prefixed differently because a row carries both and confusing them mislabels the whole list. Both can be null, and quoteSymbolSource says which of the two sources produced the quote symbol when it is not.

paysHolders is not a payment#

It is profit_to_holders_bps > 0. A true value means a share of profit funds the buyback, which burns supply. Nothing is ever paid to a holder's wallet, and a list sorted by paysHolders is a list sorted by how much of profit goes to the burn. See buyback and burn.