@demo_kite bought PEPEH $18,400 · @demo_ridge sold TENEV $46,900 · @demo_vale bought VLAD $31,250 · @demo_wren bought TENEV $22,700 · @demo_kite sold ROBIN $12,050 · @demo_ridge bought HOODIE $58,300 · @demo_vale sold VLAD $19,880 · @demo_wren sold PEPEH $27,600 · @demo_kite bought VLAD $64,900 ·

The same data, in your code.

REST and websocket access to everything on this site.

Endpoints https://api.kolhood.xyz
designed · not built

A public API over the measured data, with keys and plans. Nothing on this page is running: every figure below is example data, and no button here does anything yet.

There is no server. Nothing here can be called, no key can be issued, and no plan can be bought. The data itself is real and is on the leaderboard and the trader pages.

Method Endpoint Returns Limit
GET /v1/traders Every tracked trader, ranked by realized PnL. 60 / min
GET /v1/traders/{handle} One trader. Wallets, PnL breakdown, open size. 60 / min
GET /v1/tokens Tokens on Robinhood Chain, newest first. 120 / min
GET /v1/tokens/{ticker}/holders Holders of one token. Tracked wallets flagged. 30 / min
GET /v1/pulse Tokens ranked by how many tracked traders hold. 60 / min
GET /v1/trades Trade log. Filter by wallet, token or time. 120 / min
GET /v1/alerts Your alert rules, and every time they fired. 30 / min
WS /v1/stream Trades, alerts and holder moves as they land. 2 conn
Authentication bearer token

Every request carries a key. Send it as a bearer token in the Authorization header. A request without one returns 401, and a key over its limit returns 429 with the seconds left on it.

Keys are scoped to one plan. Rotate a key whenever you want; the old one stops working the moment the new one is issued.

# every request carries the key
curl https://api.kolhood.xyz/v1/traders/demo_ridge \
  -H "Authorization: Bearer kh_test_EXAMPLE_KEY_0000"
Response application/json

One trader, as the trader endpoint returns it. Money is in USD. Fees come back negative because you paid them. Times are UTC.

win_rate is a fraction, not a percentage. Wallets are listed in the order they were linked, and a trader can hold as many as they like.

// one trader, trimmed to the fields that matter
{
  "handle":     "demo_ridge",
  "chain":      "robinhood",
  "wallets": [
    "0x7a41c9e0b3f8d2145e6b90cc7f2a1d33b8e40f19",
    "0x2f9b60d81ac4e7735a0c19fe6b83d2470ae5c118"
  ],
  "pnl": {
    "realized":   884120.44,
    "unrealized":  61230.10,
    "fees":        -4180.62,
    "currency":   "usd"
  },
  "win_rate":   0.64,
  "updated_at": "2026-09-02T18:42:07Z"
}
Websocket wss · one socket

Open the socket, send one subscribe frame, then read. Drop the traders field to take every trade on the chain instead of a short list.

Every message is one trade: time, trader, side, ticker, size in USD, price and the block it landed in. Nothing is batched and nothing is replayed, so store what you need as it arrives.

// subscribe once, then read
const ws = new WebSocket("wss://api.kolhood.xyz/v1/stream");

ws.onopen = () => ws.send(JSON.stringify({
  type:    "subscribe",
  channel: "trades",
  traders: ["demo_ridge", "demo_kite"]
}));

ws.onmessage = (e) => {
  const t = JSON.parse(e.data);
  console.log(t.time, t.trader, t.side, t.ticker, t.usd);
};
Plans per key
Free

60 req / min

  • One key.
  • REST only.
  • Trades delayed 30 seconds.
Builder

600 req / min

  • Five keys.
  • REST and websocket.
  • Trades as they land.
Firm

6,000 req / min

  • A key per seat.
  • REST and websocket.
  • Full trade history.