Endpoints
Holders
Classified holders of a scanned token with PnL, entry time and funding source, page by page.
GET
/api/v1/tokens/{chain}/{address}/holdersReturns the analyzed holders of a token sorted by rank, with the class XCA assigned to each wallet. The token must have been scanned; otherwise you get 404.
Parameters#
chainpathrequiredChain id. Only solana for now."solana"
addresspathrequiredToken mint address.string
pagequeryPage number, starting at 1.integer ≥ 1default: 1
pageSizequeryHolders per page.10 | 25 | 50 | 100default: 100
classqueryReturn only holders of this class.ALL | HolderClassdefault: ALL
Request#
curl -s "https://app.xca.fun/api/v1/tokens/solana/DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263/holders?class=SMART_MONEY&pageSize=25" \
-H "Authorization: Bearer $XCA_API_KEY"Try it
Paste your API key to send a real request.
Response#
rowsHolders on this page.HolderRow[]
rowsHolders on this page.HolderRow[]
rankPosition by balance, 1 is the largest.number
addressWallet address.string | null
sharePctShare of the supply held.number
valueUsdValue of the holding, USD.number | null
classClass XCA assigned to the wallet.HolderClass | "HIDDEN"
flagsExtra traits of the wallet.string[]
entryAtTime of the first buy.string | null
entryBlockBlocks between launch and the first buy (snipers have small numbers).number | null
pnl30dUsdRealized and unrealized PnL over 30 days, USD.number | null
pnl30dPctPnL over 30 days, percent.number | null
winRateShare of profitable trades, 0 to 1.number | null
avgHoldSecAverage holding time, seconds.number | null
trades30dTrades over 30 days.number | null
fundedByWallet that first funded this one.string | null
clusterIdCluster the wallet belongs to.string | null
profiledA full wallet profile exists.boolean
totalVisible holders matching the filter.number
lockedCountHolders hidden by your plan's limit.number
pageCurrent page.number
pageSizeHolders per page.number
visibleLimitHow many top holders your plan shows; -1 means all.number
Example response#
{
"rows": [
{
"rank": 4,
"address": "5Hr7wZg7oBpVhH5nngRqzr5W7ZFUfCsfEhbziZJak7fr",
"sharePct": 1.92,
"valueUsd": 3641200,
"class": "SMART_MONEY",
"flags": [
"smart"
],
"entryAt": "2023-01-04T18:22:10.000Z",
"entryBlock": null,
"pnl30dUsd": 48210.7,
"pnl30dPct": 31.4,
"winRate": 0.64,
"avgHoldSec": 1209600,
"trades30d": 37,
"fundedBy": "FWznbcNXWQuHTawe9RxvQ2LdCENssh12dsznf4RiouN5",
"clusterId": null,
"profiled": true
}
],
"total": 7,
"lockedCount": 0,
"page": 1,
"pageSize": 25,
"visibleLimit": -1
}Status codes#
200Success
400validation — A parameter or the body is invalid; see
error.issues.401unauthorized — The API key is missing, malformed or revoked.
402
planRequired — Your plan doesn't include API access or this feature.404
notFound — The token wasn't scanned or the wallet wasn't profiled yet.429
rateLimited — Too many requests per minute, or the monthly quota is used up.Holder classes#
SMART_MONEY | Profitable trader over 30 days with a high win rate. |
REGULAR | Nothing notable. |
DEV | The token creator. |
DEV_BUNDLE | Bought together with the creator or was funded by the creator. |
SNIPER | Bought within the first blocks after launch. |
FRESH | Wallet created very recently. |
POOL | Liquidity pool, vault or bonding curve. |
CEX | Centralized exchange wallet. |
BURN | Burn address. |
Good to know#
- Your plan caps how many top holders are visible; total counts only the visible ones and
lockedCountsays how many more exist. - Filtering by
SNIPER,DEV_BUNDLE,SMART_MONEYorFRESHrequires the matching feature in your plan, otherwise you get 402. - A class your plan can't see comes back as
HIDDEN. - PnL fields depend on the plan's PnL level: basic gives pnl30dUsd and
winRate, detailed adds pnl30dPct,avgHoldSecand trades30d.