Holders
On-chain holder concentration and ranked holder lists for any token, served from indexed holder state. Updated continuously as transfers land — no batch jobs.
Available at Layer 1 and above.
GET /v1/token/{mint}/holders/summary
Distinct holder count, three-tier concentration (top-10 / top-50 / top-100), and hydration status. Powers the “Top 10 hold X%” badge.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
mint | path | string | yes | Solana token mint address |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/token/EPjFWd.../holders/summary"Response
{
"mint": "EPjFWd...",
"distinctCount": 18420,
"totalBalanceRaw": "999850000000000",
"supplyRaw": "1000000000000000",
"top10Pct": 24.6,
"top50Pct": 41.2,
"top100Pct": 52.9,
"hydrationStatus": "hydrated",
"lastUpdatedSlot": 245678901,
"lastUpdatedTsMs": 1709654400000,
"asOfTsMs": 1709654400123
}Field notes
totalBalanceRawandsupplyRaware raw token units encoded as strings to preserve precision across JavaScript clients.top{N}Pctisnullwhen fewer thanNdistinct holders exist. Always render alongsidedistinctCountso the user knows the denominator.supplyRawisnullfor tokens whose mint hasn’t been validated yet. When missing, treattotalBalanceRawas the denominator.
Hydration status
| Value | Meaning | UX hint |
|---|---|---|
hydrating | Initial holder set is still being collected | Render a spinner; concentration values may be unstable |
hydrated | Full holder set has been observed | Display normally |
born_forward | Token first appeared after Conyr started indexing | Display normally — every transfer has been captured from the start |
partial_forward | Backfill is incomplete; only forward state is authoritative | Render concentration as a lower bound and surface a small disclaimer |
Cache TTL: 15 seconds.
GET /v1/token/{mint}/holders/top
Ordered top-N holders with per-wallet share of totalBalanceRaw.
Parameters
| Parameter | In | Type | Required | Default | Constraints |
|---|---|---|---|---|---|
mint | path | string | yes | — | — |
n | query | integer | no | 10 | 1–500 |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/token/EPjFWd.../holders/top?n=10"Response
{
"mint": "EPjFWd...",
"distinctCount": 18420,
"totalBalanceRaw": "999850000000000",
"hydrationStatus": "hydrated",
"holders": [
{
"rank": 1,
"wallet": "9xQeWp...",
"balanceRaw": "120000000000000",
"pctOfTotal": 12.0,
"firstSeenSlot": 245678901
}
],
"asOfTsMs": 1709654400123
}Cache TTL: 15 seconds.
GET /v1/token/{mint}/holders
Paginated full holder list, ordered by balanceRaw descending.
Parameters
| Parameter | In | Type | Required | Default | Constraints |
|---|---|---|---|---|---|
mint | path | string | yes | — | — |
limit | query | integer | no | 100 | 1–1000 |
offset | query | integer | no | 0 | — |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/token/EPjFWd.../holders?limit=100&offset=0"Response
{
"mint": "EPjFWd...",
"distinctCount": 18420,
"totalBalanceRaw": "999850000000000",
"hydrationStatus": "hydrated",
"holders": [
{
"rank": 1,
"wallet": "9xQeWp...",
"balanceRaw": "120000000000000",
"pctOfTotal": 12.0,
"firstSeenSlot": 245678901
}
],
"limit": 100,
"offset": 0,
"nextOffset": 100,
"asOfTsMs": 1709654400123
}Pagination: when nextOffset is present, pass it back as offset to fetch the next page. When nextOffset is null, the list is exhausted.
Cache TTL: 15 seconds.