Tokens

Live holders, holder count + concentration

A live holder census read from the ledger at confirmed: every token account of the mint (owner + balance via mint-scoped getProgramAccounts), merged per owner. Gives an EXACT holder_count (distinct non-zero owners minus excluded pools/curves/burns), token_accounts_nonzero, ranks 1–100 retained, and top1/top10/top20/top50/top100_share over the circulating denominator. Each disclosed owner is labelled from MadeOnSol wallet intelligence (deployer / kol / early_buyer / bundle / bot / dump_cluster). Program-derived owners (liquidity pools, bonding curves, vaults) and burn addresses are EXCLUDED from the denominator and listed in excluded[] — the #1 raw account of a fresh memecoin is its own bonding curve. Disclosure: PRO ranks 1–10, ULTRA 1–50, BUSINESS 1–100; the maths is tier-independent. Measured latency: fresh pump.fun mints <1 s, $0.1–2M memecoins ~0.1–1.2 s, 200k–550k-account tokens 6–11 s (503 holder_scan_in_progress then cached). Mega-caps the provider refuses (TRUMP/JUP/BONK class) fall back to the top-20 getTokenLargestAccounts view with holder_count: null and source.census_fallback_reason set — never a trade-derived estimate. The same fallback applies when the census times out, and (since 2026-10-02) when a census's balances add up to more than the mint's supply: such a read is not one consistent ledger snapshot, so it is refused rather than served (census_fallback_reason: census_inconsistent_sum_exceeds_supply). Distinct from /cap-table (who bought first) — this is who holds NOW.

get/tokens/{mint}/holders

Request

  • Base URL: https://madeonsol.com/api/v1
  • URL: https://madeonsol.com/api/v1/tokens/{mint}/holders
  • Auth: HTTP bearer

Path parameters

mintstring required
Example:FfuWjhMm5LP3anZ5zq8SG4iqzYVvhM4LoyNMM957pump

Query parameters

include_wallet_flagsboolean

Opt in (TR-07) to per-holder wallet_flags + top-level wallet_flags_meta. Solana: PRO+ (route tier), tier-disclosed rows only. Flags come from MadeOnSol's indexed wallet populations: a false/null with label_coverage.evaluated=false means insufficient evidence, NOT a verified negative. Any value other than true/false is a 400 (invalid_include_wallet_flags).

Response

OK

mintstring
slotinteger

Ledger slot the holder set was read at.

as_ofstring date-time
countinteger
disclosedinteger

Rank cap by tier: 10 PRO, 50 ULTRA, 100 BUSINESS.

Changes

No recorded changes to this operation across all 1 revision of this API.