CopyFomo Request API access
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 see

CopyFomo 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.

GET /health read token

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"
}
FieldTypeMeaning
okbooleanWhether the stored Fomo session JWT is still fresh enough to sync.
tradersnumberRows in the traders table (not only Solana-confirmed).
jwtExpiresAtstring | nullISO timestamp of Fomo JWT expiry. Not the token itself.
hasBrowserSessionbooleanWhether a browser storage state is present for JWT refresh.
lastSyncstring | nullISO timestamp of the last full leaderboard ingest.
GET /traders read token

Paginated leaderboard of Solana-confirmed traders, sorted by a PnL window.

QueryDefaultNotes
limit50Integer 1–200.
offset0Skip this many rows.
window24h24h, 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.

GET /traders/:id read token

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.

GET /tokens/:mint read token

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.

StatusBodyWhen
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

FieldTypeOn listMeaning
idstringyesFomo trader id.
handlestringyesFomo handle, unique.
display_namestring | nullyesDisplay name.
avatar_urlstring | nullyesAvatar image URL.
solana_addressstringyesSolana wallet.
evm_addressstring | nullyesEVM wallet, when Fomo has one.
twitterstring | nullyesTwitter/X handle or URL from Fomo.
biostring | nullyesProfile bio.
clan_namestring | nullyesClan, when set.
followersnumber | nullyesFollower count.
followingnumber | nulldetail onlyFollowing count.
num_tradesnumber | nullyesTrade count.
total_volumenumber | nullyesReported volume.
pnl_24h / pnl_7d / pnl_30dnumber | nullyesWindow PnL.
pnl_allnumber | nulldetail onlyAll-time PnL from Fomo.
total_pnlnumber | nullyesTotal PnL field from Fomo (nullable until synced).
win_ratenumber | nullyesWin rate as reported by Fomo.
avg_hold_time_secsnumber | nullyesAverage hold time in seconds.
last_synced_atstringyesLast time this row was written.

Holding

FieldTypeMeaning
token_addressstringMint / token address.
network_idnumber1399811149 is Solana. Other chain ids may appear on a trader’s full holdings.
human_amountnumber | nullToken amount in human units.
pricenumber | nullUnit price at sync.
valuenumber | nullPosition value.
pnl / position_pnlnumber | nullUnrealized PnL on the position. Named position_pnl on /tokens/:mint.
image_urlstring | nullToken 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.

Request API access