---
title: "First buyers of a Robinhood Chain token, and whether they still hold (PRO+)"
method: GET
path: "/rhc/tokens/{address}/early-buyers"
tags: ["Robinhood Chain"]
---

# First buyers of a Robinhood Chain token, and whether they still hold (PRO+)

`GET /rhc/tokens/{address}/early-buyers`

## Request

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

The first buyers of a Robinhood Chain token, in order, joined to what happened next. `rhc_early_buyers` ranks the first 20 buyers of 437k tokens and is recomputed daily; until now it was read only as a per-wallet COUNT, never exposed as a per-token list. The Solana counterpart is `GET /kol/tokens/{mint}/entry-order`.

**`realized_eth` is observed sell-minus-buy ETH cashflow, NOT validated FIFO realized PnL.** Missing earlier buys, transfers and source gaps affect cost basis; read `position` and holding evidence separately.

**Default `still_holding`** requires a successful holder fold and a supply reconciliation. On failed/partial source it is null, not an invented exit. **Optional `verify_current_balances=true` (ULTRA+)** checks every ranked first buyer via `balanceOf` on the existing private Hood node at one pinned block with a matching block-hash recheck. If any RPC call, block check or the ranked cohort/statistics is unavailable, the **whole strict request fails (503)** rather than returning partially verified balances. Maximum 20 wallets; additional RPC is opt-in only. `holder_recon_block`/`holder_recon_checked_at` refer to the separate existing fold, not atomic chain-head balance proof.

**Ranks are as of `computed_at`, not live.** A token that began trading after the last sweep returns an empty list with a stated reason - never an assertion that it had no early buyers. Wallets may be ERC-4337 smart accounts, so a wallet is an address, not a person.

## Path parameters

- `address` string, required

## Query parameters

- `limit` integer
- `verify_current_balances` boolean
- `include_scout_scores` boolean

## Response `200`

OK. An empty early_buyers array with a note means the token is not yet ranked.

- object
  - `chain` 'robinhood'
  - `token_address` string
  - `early_buyers` object[]
    - `rank` integer: 1 = first buyer observed.
    - `wallet` string
    - `first_buy_at` string, date-time, nullable
    - `first_buy_block` integer, nullable
    - `still_holding` boolean, nullable: Null when the holder-table read, uint256 value, or supply reconciliation is unverified; never falsely infer exit.
    - `balance` string, nullable: Raw uint256 as a decimal STRING, may be source-unverified.
    - `holding_status` 'verified_nonzero' | 'verified_zero' | 'unverified': Source-verified fold observation; not necessarily current chain-head proof.
    - `holding_reason` 'holder_read_failed' | 'supply_reconciliation_unverified' | 'invalid_holder_balance' | 'indexed_nonzero_balance' | 'indexed_zero_balance' | 'pinned_chain_nonzero_balance' | 'pinned_chain_zero_balance' | 'pinned_chain_balance_missing'
    - `position` 'closed' | 'open' | 'unknown'
    - `bought_eth` number, nullable
    - `sold_eth` number, nullable
    - `realized_eth` number, nullable: Legacy field name: observed sold_eth - bought_eth net ETH flow, NOT transfer-aware FIFO PnL.
    - `trades` integer, nullable
    - `avg_entry_mc_usd` number, nullable
    - `is_kol` boolean, nullable: Only with include_scout_scores=true. False = not a known KOL address; null = unknown (scout read failed).
    - `scout_score` object, nullable: Only with include_scout_scores=true: this KOL's scout score as of its own first_buy_at (no hindsight). Null for non-KOLs or when unknown.
      - `as_of` string, date-time: The moment the score describes; every input is at or before it.
      - `first_touches_30d` integer: First touches in [as_of - 30 d, as_of - 4 h].
      - `avg_followers_4h` number, nullable
      - `swarm_3plus_pct` number, nullable: % of first touches that drew ≥3 other KOLs within 4 h.
      - `swarm_5plus_pct` number, nullable: % of first touches that drew ≥5 other KOLs within 4 h.
      - `scout_tier` 'S' | 'A' | 'B' | 'C', nullable: Null below 30 first touches.
  - `scout_scores_status` 'ok' | 'unavailable' | 'timeout' | 'error': Only with include_scout_scores=true. unavailable = hood rhc/038 not applied.
  - `scout_scores_note` string: Only with include_scout_scores=true: the scout score method.
  - `count` integer
  - `computed_at` string, date-time, nullable
  - `holdings_verified` boolean, nullable: True only when the holder read succeeded AND token supply reconciles at a previously checked block.
  - `holder_recon_block` integer, nullable: Block of the latest supply reconciliation; no atomic snapshot guarantee for holder rows.
  - `holder_recon_checked_at` string, date-time, nullable
  - `onchain_balance_verification` object: Present only after ALL ULTRA+ verify_current_balances checks passed at one pinned block on our Hood node.
    - `source` 'rhc_node_pinned_balanceOf'
    - `block_number` integer
    - `block_hash` string
    - `checked_at` string, date-time
    - `verified_wallets` integer
    - `complete` true
  - `summary` object, nullable
    - `ranked` integer
    - `with_holding_data` integer
    - `still_holding` integer
    - `exited` integer: Only source-verified zero balance wallets, including transfer-outs.
    - `unknown_holding` integer: Wallets missing a valid holder read / supply reconciliation / raw balance.
    - `closed_positions` integer
    - `realized_eth_closed_only` number, nullable
  - `note` string: Present only when the list is empty.

## Other responses

- `400`: Invalid token 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, ULTRA for verify_current_balances.
- `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`: Strict verification requested but some ranked buyers, trade stats, canonical block hash or ERC-20 balances could not be proved; no partial panel returned. Retry later.

---

[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/5db123bfc4d4?raw)
