On this page
Overview Request access Authentication Rate limits GET /health GET /traders GET /traders/:id GET /tokens/:mint Errors Field reference What a token can seeCopyFomo API
A read-only snapshot of Solana-confirmed traders from the Fomo.family leaderboard — wallets, volume, PnL, socials, hold time, and top holdings. Tokens are issued by 5 Star. There is no signup and no public key.
Base URL: https://copyfomo.join5star.xyz. JSON over HTTPS. Every consumer route below requires Authorization: Bearer <token> except this documentation.
Request a named token at contact@join5star.xyz.
A valid token can call GET /health, GET /traders, GET /traders/:id, and GET /tokens/:mint, including total_volume, twitter, bio, win_rate, avg_hold_time_secs, total_pnl, following, and pnl_all. Volume and profile fields refresh on the scheduled Fomo sync. twitter and win_rate are stored when Fomo sends them — Fomo currently leaves most Twitter fields empty and does not send a win-rate field.
Access is by contact only
Email 5 Star with who you are, what you will call, and roughly how often. If we issue a token it is read-only, unique to you, and can be rotated without affecting anyone else. Do not share it, put it in a client app, or commit it.
Authentication
Send the token 5 Star issued you as a Bearer token. No other header is required. A missing, malformed, or unknown token returns 401 with {"error":"unauthorized"}.
Authorization: Bearer $COPYFOMO_TOKEN
Write and session routes use a separate operator secret. A consumer token always receives 401 there — that is correct, not a misconfiguration.
Rate limits
30 requests per 60 seconds per issued token. Going over returns 429 with {"error":"rate limited"}. Each consumer has its own bucket; two bots with two tokens do not share quota.
The snapshot is refreshed on a scheduled sync. Use last_synced_at on a trader, or lastSync on /health, rather than polling faster than you need.
Endpoints
Only traders with confirmed Solana holdings appear in list and lookup responses. A Fomo profile that has a Solana address but no nonzero Solana position is omitted (and a direct lookup returns 404) so you never follow a wallet that cannot fire on Solana.
Sync freshness and trader count. Does not return the Fomo login, cookies, or JWT value.
curl -sS https://copyfomo.join5star.xyz/health \
-H "Authorization: Bearer $COPYFOMO_TOKEN"
{
"host": "cloudflare-worker",
"ok": true,
"traders": 188,
"jwtExpiresAt": "2026-09-17T12:04:00.000Z",
"hasBrowserSession": true,
"lastSync": "2026-09-17T00:12:04.000Z"
}
| Field | Type | Meaning |
|---|---|---|
ok | boolean | Whether the stored Fomo session JWT is still fresh enough to sync. |
traders | number | Rows in the traders table (not only Solana-confirmed). |
jwtExpiresAt | string | null | ISO timestamp of Fomo JWT expiry. Not the token itself. |
hasBrowserSession | boolean | Whether a browser storage state is present for JWT refresh. |
lastSync | string | null | ISO timestamp of the last full leaderboard ingest. |
Paginated leaderboard of Solana-confirmed traders, sorted by a PnL window.
| Query | Default | Notes |
|---|---|---|
limit | 50 | Integer 1–200. |
offset | 0 | Skip this many rows. |
window | 24h | 24h, 7d, or 30d. Sets the sort column. Unknown values fall back to 24h. |
curl -sS "https://copyfomo.join5star.xyz/traders?limit=50&window=24h" \
-H "Authorization: Bearer $COPYFOMO_TOKEN"
{
"traders": [
{
"id": "fomo-uuid",
"solana_address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
"evm_address": "0xabc…",
"handle": "somehandle",
"display_name": "Some Handle",
"avatar_url": "https://…",
"followers": 1204,
"num_trades": 318,
"total_volume": 184220.5,
"clan_name": null,
"pnl_24h": 4120.11,
"pnl_7d": 18840.02,
"pnl_30d": 55210.4,
"last_synced_at": "2026-09-17 00:12:04",
"twitter": "somehandle",
"bio": "…",
"win_rate": 0.61,
"avg_hold_time_secs": 5400,
"total_pnl": 128440.0
}
],
"limit": 50,
"offset": 0,
"window": "24h",
"total": 188
}
total is the Solana-confirmed population, not the page size. Newer profile fields (twitter, bio, win_rate, avg_hold_time_secs, total_pnl) are nullable until a sync has filled them.
One trader plus their top holdings. :id may be the Fomo id, the handle (with or without a leading @, case-insensitive), or the Solana address (exact, base58).
curl -sS https://copyfomo.join5star.xyz/traders/somehandle \
-H "Authorization: Bearer $COPYFOMO_TOKEN"
{
"trader": { "id": "fomo-uuid", "handle": "somehandle", "following": 80, "pnl_all": 128440.0 },
"holdings": [
{
"id": 12,
"trader_id": "fomo-uuid",
"token_address": "So11111111111111111111111111111111111111112",
"network_id": 1399811149,
"human_amount": 12.4,
"price": 148.2,
"value": 1837.68,
"pnl": 220.5,
"image_url": "https://…"
}
]
}
Unknown, non-Solana-confirmed, or unmatched lookups return 404 {"error":"not found"}. The trader object is the full row, including following, pnl_all, and internal change-detection hashes (trader_hash, holdings_hash) which you can ignore.
Which tracked traders currently hold this Solana mint, ranked by position value. Capped at 20. network_id is always Solana (1399811149). Holder rows include the same Fomo profile fields as the leaderboard (twitter, bio, win_rate, avg_hold_time_secs, total_pnl).
curl -sS https://copyfomo.join5star.xyz/tokens/So11111111111111111111111111111111111111112 \
-H "Authorization: Bearer $COPYFOMO_TOKEN"
{
"mint": "So11111111111111111111111111111111111111112",
"count": 2,
"holders": [
{
"id": "fomo-uuid",
"handle": "somehandle",
"display_name": "Some Handle",
"avatar_url": "https://…",
"followers": 1204,
"pnl_24h": 4120.11,
"pnl_7d": 18840.02,
"pnl_30d": 55210.4,
"pnl_all": 128440.0,
"twitter": "somehandle",
"bio": "…",
"win_rate": 0.61,
"avg_hold_time_secs": 5400,
"total_pnl": 128440.0,
"human_amount": 12.4,
"price": 148.2,
"value": 1837.68,
"position_pnl": 220.5,
"network_id": 1399811149
}
]
}
Errors
Every error body is JSON with an error string. There is no envelope wrapper on success.
| Status | Body | When |
|---|---|---|
401 | {"error":"unauthorized"} | Missing/invalid token, or a consumer token on an operator route. |
404 | {"error":"not found"} | Unknown path, or trader/mint lookup with no Solana-confirmed match. |
429 | {"error":"rate limited"} | More than 30 requests in 60 seconds on this token. |
500 | {"error":"…"} | Unhandled server error. Retry later. |
Responses set Content-Type: application/json; charset=utf-8 and Cache-Control: no-store.
Field reference
Trader
| Field | Type | On list | Meaning |
|---|---|---|---|
id | string | yes | Fomo trader id. |
handle | string | yes | Fomo handle, unique. |
display_name | string | null | yes | Display name. |
avatar_url | string | null | yes | Avatar image URL. |
solana_address | string | yes | Solana wallet. |
evm_address | string | null | yes | EVM wallet, when Fomo has one. |
twitter | string | null | yes | Twitter/X handle or URL from Fomo. |
bio | string | null | yes | Profile bio. |
clan_name | string | null | yes | Clan, when set. |
followers | number | null | yes | Follower count. |
following | number | null | detail only | Following count. |
num_trades | number | null | yes | Trade count. |
total_volume | number | null | yes | Reported volume. |
pnl_24h / pnl_7d / pnl_30d | number | null | yes | Window PnL. |
pnl_all | number | null | detail only | All-time PnL from Fomo. |
total_pnl | number | null | yes | Total PnL field from Fomo (nullable until synced). |
win_rate | number | null | yes | Win rate as reported by Fomo. |
avg_hold_time_secs | number | null | yes | Average hold time in seconds. |
last_synced_at | string | yes | Last time this row was written. |
Holding
| Field | Type | Meaning |
|---|---|---|
token_address | string | Mint / token address. |
network_id | number | 1399811149 is Solana. Other chain ids may appear on a trader’s full holdings. |
human_amount | number | null | Token amount in human units. |
price | number | null | Unit price at sync. |
value | number | null | Position value. |
pnl / position_pnl | number | null | Unrealized PnL on the position. Named position_pnl on /tokens/:mint. |
image_url | string | null | Token image, on the trader detail holdings array. |
What a read token can see
Included
- Every Solana-confirmed trader in the current snapshot — not a per-app subset.
- Handles, display names, avatars, Twitter, bio, clan.
- Solana and EVM wallets.
- Followers, trades, volume, PnL windows, win rate, hold time.
- Top holdings and “who holds this mint” among tracked traders.
- Health metadata (counts, last sync, JWT expiry time).
Not included
- Traders with no confirmed Solana position.
- The Fomo JWT, cookies, or browser session.
- Write access — ingest, JWT seed, session seed, harvest.
- Anyone else’s token. Each consumer is issued their own.
- Unscheduled live Fomo data. You read our last sync, not Fomo directly.
Request a token
Send a short note to contact@join5star.xyz with your project, the endpoints you need, and expected volume. We issue read tokens individually. This page is the full consumer contract.