Tools · data
Token holders & concentration
Who holds an ERC-20: the top 10 holders with their share of supply and whether each is a contract, locked or a burn address, the LP holders and how much LP is locked, the creator's and owner's share, holder count, and concentration with burned/locked supply excluded. Base, Ethereum and five more chains. Send {} for USDC on Base. Pay-per-call via x402.
$0.0027 per call, paid in USDC on Base or Solana with x402 — no account, no API key. POST https://fiatdock.com/v1/token/holders (or GET with the same fields as query parameters) · MCP tool token_holders. An answer the tool cannot produce is refused with 4xx/5xx and is not charged.
Inputs
| Field | Type | Description | Example |
|---|---|---|---|
token | string | ERC-20 contract address (0x…). Omit the whole body to get USDC on Base | "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" |
chain | one of base, ethereum, polygon, arbitrum, optimism, bsc, avalanche | Chain, default base | "base" |
Example
Request body
{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}
Answer (the published example)
{"network":"base","token":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","name":"USD Coin","symbol":"USDC","holderCount":13057390,"topHolders":[{"address":"0x0000000000000000000000000000000000000001","pct":6.12,"isContract":true,"isLocked":false,"isBurn":false,"tag":null}],"top10Pct":31.4,"top10ControlledPct":31.4,"lpHolderCount":null,"lpHolders":[],"lpLockedPct":0,"creator":{"address":"0x0000000000000000000000000000000000000002","pct":0},"owner":null,"source":"GoPlus Security on-chain scan (top 10 holders)","asOf":"2026-10-05T00:00:00.000Z","note":"pct is the share of total supply; top10ControlledPct leaves out burn addresses and locked holdings."}
Call it
curl
# 1) ask: an unpaid call answers 402 with the exact price (free)
curl -i -X POST https://fiatdock.com/v1/token/holders -H 'content-type: application/json' -d '{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}'
# 2) pay: any x402 client signs that 402 and resends — see Node or Python below
Node
// npm i @x402/fetch @x402/evm viem
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
const pay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: "eip155:*", client: new ExactEvmScheme(privateKeyToAccount(process.env.AGENT_PRIVATE_KEY)) }],
});
const r = await pay("https://fiatdock.com/v1/token/holders", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}),
});
console.log(r.status, await r.json());
Python
# pip install "x402[httpx,evm]"
import asyncio, json, os
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm.exact import register_exact_evm_client
async def main():
client = register_exact_evm_client(x402Client(), Account.from_key(os.environ["AGENT_PRIVATE_KEY"]))
async with x402HttpxClient(client) as http:
r = await http.post("https://fiatdock.com/v1/token/holders", json=json.loads("{\"token\":\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\"chain\":\"base\"}"))
print(r.status_code, r.json())
asyncio.run(main())
MCP (Claude, Cursor, any MCP client)
{"mcpServers":{"fiatdock":{"command":"npx","args":["-y","fiatdock-mcp"],"env":{"AGENT_PRIVATE_KEY":"0x<your agent wallet key>"}}}}
// then call the tool "token_holders" — the package pays each call from that wallet
The wallet needs USDC on Base. Prefer no install? The remote server https://fiatdock.com/mcp answers the 402 as tool output for an agent that signs its own payments.
Related tools
- Address intelligence on Base — $0.0045
- Base gas price — $0.001
- Base latest block — $0.001
- ETH balance on Base — $0.001
- USDC balance on Base — $0.001
- ERC-20 token metadata — $0.002
Machine-readable: OpenAPI · tools.json · llms.txt · /.well-known/x402