---
title: "Scout KOL leaderboard on Robinhood Chain (PRO+)"
method: GET
path: "/rhc/kol/scouts/leaderboard"
tags: ["Robinhood Chain"]
---

# Scout KOL leaderboard on Robinhood Chain (PRO+)

`GET /rhc/kol/scouts/leaderboard`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/rhc/kol/scouts/leaderboard`
- Auth: HTTP bearer

Robinhood Chain port of `GET /kol/scouts/leaderboard` (2026-10-15). A first touch is a KOL buy of a token no KOL bought before (chain order). Per KOL: first touches in the last 30 days that are at least 4 hours old, how many other KOLs bought within 4 hours (`avg_followers_4h`), and the share that drew ≥3 / ≥5 (`swarm_3plus_pct` / `swarm_5plus_pct`). `scout_tier` S ≥ 40 / A ≥ 25 / B ≥ 15 / C on `swarm_3plus_pct`, null below 30 first touches.

Differences from Solana: identity is the KOL (a KOL with several EVM addresses is one scout and never its own follower; `evm_addresses` lists them), and KOLs below `min_first_touches` (default 30) are left out instead of listed with a null tier. Computed point in time as of `as_of` (no MV), cached 5 minutes. 503 `scout_scores_unavailable` when the score cannot be computed (never an empty ranking).

## Query parameters

- `limit` integer
- `scout_tier` 'S' | 'A' | 'B' | 'C'
- `sort` 'scout_score' | 'n_first_touches_30d' | 'swarm_3plus_pct' | 'swarm_5plus_pct' | 'avg_followers_4h'
- `min_first_touches` integer

## Response `200`

OK

- object
  - `chain` 'robinhood'
  - `as_of` string, date-time
  - `scouts` object[]
    - `kol_id` string, uuid
    - `name` string, nullable
    - `twitter_url` string, nullable
    - `avatar_url` string, nullable
    - `evm_addresses` string[]
    - `as_of` string, date-time
    - `first_touches_30d` integer
    - `avg_followers_4h` number, nullable
    - `swarm_3plus_pct` number, nullable
    - `swarm_5plus_pct` number, nullable
    - `scout_tier` 'S' | 'A' | 'B' | 'C', nullable
  - `count` integer
  - `min_first_touches` integer
  - `method` object
    - `tier_min_first_touches` integer
    - `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`: Tier gate - PRO required.
- `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`: scout_scores_unavailable (hood rhc/038 not applied) or scout_scores_temporarily_unavailable.

---

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