---
title: "Smart-money wallet ranking on Robinhood Chain (PRO+)"
method: GET
path: "/rhc/alpha-wallets"
tags: ["Robinhood Chain"]
---

# Smart-money wallet ranking on Robinhood Chain (PRO+)

`GET /rhc/alpha-wallets`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/rhc/alpha-wallets`
- Auth: HTTP bearer

Robinhood Chain trader wallets ranked by realized on-chain performance — the reverse of KOL discovery: instead of tracing Solana wallets onto RHC, we rank the wallets we already watch trade. `net_eth` is realized net flow (sell − buy, honest about ignoring unrealized holdings); `win_rate` is the share of traded tokens taken out profitably; `likely_bot` flags atomic-arb/MM fleets (near-perfect win rate across many tokens). Because RHC is dual-natured (launchpad memecoins vs tokenized stocks/stables), `memecoin_share` = launchpad-token trade share — filter with `min_memecoin_share` to isolate memecoin traders, or `max_avg_mc_usd` for low-caps. Derived from our self-hosted node, refreshed every 15 min.

**Zero-cost-basis dumps, filtered by default** (*added 2026-08-29*): `net_eth` is `sell_eth − buy_eth` per wallet, and for a token a wallet never bought (its own on-chain buy leg unattributed — almost always a deployer/insider allocation sold with no purchase), the whole sale counts as "profit" even though it isn't trading skill. `zero_cost_share` is the fraction of a wallet's gross ETH extracted (sell-side) that came from such tokens; wallets at or above 0.5 are excluded from this listing by default (~23% of tracked wallets, concentrated at the very top of a raw net_eth sort) since their ranking and win_rate are inflated by dumps, not performance. The row still exists in the underlying dataset — pass `include_zero_cost_dumps=true` for the unfiltered ranking, and read `zero_cost_share` on each row either way; do not treat a high `net_eth` from this endpoint as trading profit without checking it. Tier: **PRO+**.

## Query parameters

- `classification` 'all' | 'human' | 'bot' | 'smart_money'
- `identity` 'all' | 'known_kol' | 'unknown'
- `min_memecoin_share` number
- `max_avg_mc_usd` number
- `min_net_eth` number
- `min_win_rate` number
- `max_win_rate` number
- `min_trades` integer
- `min_tokens` integer
- `min_buy_eth` number
- `active_hours` integer
- `sort` 'net_eth' | 'win_rate' | 'trades' | 'tokens' | 'buy_eth' | 'memecoin_share' | 'last_trade_at'
- `order` 'desc' | 'asc'
- `limit` integer
- `offset` integer
- `include_zero_cost_dumps` boolean

## Response `200`

OK.

- object
  - `chain` 'robinhood'
  - `wallets` object[]
    - `wallet` string: Trader EOA (lowercase 0x).
    - `classification` 'bot' | 'smart_money' | 'trader'
    - `is_known_kol` boolean
    - `trades` integer
    - `tokens` integer
    - `buy_eth` number
    - `sell_eth` number
    - `net_eth` number: Realized net flow (sell − buy).
    - `win_rate` number, nullable
    - `memecoin_share` number, nullable: Share of trades in launchpad memecoins (vs tokenized stocks/stables).
    - `avg_trade_mc_usd` number, nullable
    - `last_trade_at` string, date-time, nullable
    - `zero_cost_share` number, nullable: Share of gross ETH extracted from tokens with no recorded buy (deployer/insider dumps). Null = never sold. ≥0.5 wallets are excluded unless include_zero_cost_dumps=true.
  - `total` integer
  - `limit` integer
  - `offset` integer
  - `has_more` boolean
  - `attribution` object: Interim attribution disclosure: mv_rhc_alpha_wallets is built from attributed trades only (`trader_eoa IS NOT NULL`), and trader_eoa was only written reliably from 2026-07-18 — pre-floor history is not reflected in win_rate/net_eth/classification. Removed once the trader_eoa backfill lands.
    - `attribution_complete_from` string, date-time
    - `note` string

## Other responses

- `400`: Invalid query parameters.
- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: Requires Pro or Ultra tier.
- `429`: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
- `500`: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
- `503`: Temporarily unavailable — a Postgres statement timeout while the dataset is under load or maintenance (`statement_timeout`, with `X-RateLimit-*` and `_rid`), or the API-key lookup itself unavailable (`auth_backend_unavailable`, authentication stage: no `X-RateLimit-*`, no `_rid`, not counted as a failed authentication). Always carries `Retry-After`; honour it.

---

[API](https://skmtc.dev/madeonsol/apis/madeonsol-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-api/revisions/96ce84657f55?raw)
