60 req / min
- One key.
- REST only.
- Trades delayed 30 seconds.
REST and websocket access to everything on this site.
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.
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"
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" }
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); };
60 req / min
600 req / min
6,000 req / min