---
title: "Every KOL trade on one Robinhood Chain token, with optional current balances (BASIC+)"
method: GET
path: "/rhc/tokens/{address}/kol-trades"
tags: ["Robinhood Chain"]
---

# Every KOL trade on one Robinhood Chain token, with optional current balances (BASIC+)

`GET /rhc/tokens/{address}/kol-trades`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/rhc/tokens/{address}/kol-trades`
- Auth: HTTP bearer

Every stored KOL trade on one Robinhood Chain token, newest first, in one payload (2026-10-15): KOL name, EVM address, side, ETH and token amounts, price and market cap at the trade, DEX, tx hash, log index, block and time. Keyset paging with `next_cursor` / exact `has_more`. Same tier depth as `/rhc/kol/feed` (BASIC: 5-minute delay, 20 rows).

**`include_balances=true` (PRO+)** adds `balances`: `balanceOf(token)` for every KOL address on the page, read in one Multicall3 batch from our own Robinhood Chain node at `checked_at`. A failed read is `status: unverified` with a `reason` and null balance, never a zero, and the balance is never reconstructed from trades (an open FIFO lot is not proof of a held balance).

## Path parameters

- `address` string, required

## Query parameters

- `limit` integer
- `action` 'buy' | 'sell'
- `since` string, date-time
- `cursor` string
- `kol` string
- `include_balances` boolean

## Response `200`

OK

- object
  - `chain` 'robinhood'
  - `token_address` string
  - `trades` object[]
    - `id` string
    - `kol_name` string, nullable
    - `kol_twitter` string, nullable
    - `evm_address` string
    - `action` 'buy' | 'sell'
    - `eth_amount` number, nullable
    - `token_amount` number, nullable
    - `price_usd_at_trade` number, nullable
    - `market_cap_usd_at_trade` number, nullable
    - `dex` string, nullable
    - `tx_hash` string
    - `log_index` integer, nullable
    - `block_number` integer, nullable
    - `traded_at` string, date-time
  - `count` integer
  - `kols_on_page` integer: Distinct KOL addresses on this page.
  - `next_cursor` string, nullable
  - `has_more` boolean: Exact (limit + 1 probe).
  - `note` string
  - `balances` object: Only with include_balances=true.
    - `source` 'rhc_node_balanceOf_latest'
    - `checked_at` string, date-time, nullable
    - `by_wallet` object
    - `summary` object
      - `wallets` integer
      - `verified` integer
      - `holding` integer
      - `zero` integer
      - `unverified` integer

## Other responses

- `400`: Invalid address or 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 for include_balances.
- `429`: Rate limited, or the heavy-query limiter refused the balance read.
- `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

---

[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)
