Token screener and token holders: free on-chain token API
A token screener and a token holders API for Ethereum, BNB Chain, Base and HyperEVM: find a token's contract, rank tokens by volume, inflow or smart-money inflow, see the top holders of a token by their real balance and share of the supply, and who bought or sold it today. Ask your AI, or call it from code on one free key.
“Who are the top holders of PEPE by balance, and what share of the supply do they hold?”
token_search token_holders“Which tokens did smart money buy the most this week?”
token_screenerFind a token's contract
By symbol or name, on any of the four chains.
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/search?q=Wrapped+Ether&limit=5"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=Wrapped+Ether&limit=5",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data token search "Wrapped Ether" --limit 5
# any MCP client; or from the terminal:
vike-data call token_search --args '{"query": "Wrapped Ether", "limit": 5}'
- Match by symbol or name, any case: an exact symbol first, then symbols and names that start with what you typed. A contract address is not searched.
- Every answer carries the
token_addressthe other token routes take:0x+ 40 lower-case hex digits. - Pass
chainfor BNB Chain, Base or HyperEVM; the default is Ethereum.
Token screener: rank tokens by on-chain activity
The tokens wallets moved, bought or accumulated most in a window.
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/screener?window=7d&sort=smart_inflow&limit=20"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?window=7d&sort=smart_inflow&limit=20",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data token screener --window 7d --sort smart_inflow --limit 20
# any MCP client; or from the terminal:
vike-data call token_screener --args '{"window": "7d", "sort": "smart_inflow", "limit": 20}'
| sort | ranks tokens by |
|---|---|
volume | USD moved in the window, in and out |
net_inflow | USD in minus USD out: who is accumulating |
holders | how many wallets sent or received it |
smart_inflow | net inflow of the smart-money wallets alone (Ethereum) |
- Windows:
24h,7d,30d,90d. Up to 100 tokens. - Filters:
min_volume_usd,min_holders, andsmart_money_onlyfor the smart-money wallets alone. - Smart money = wallets with more than $100,000 of realized profit on Ethereum; Ethereum only.
Token screener
Tokens ranked by window volume, net inflow, holder count or smart-money inflow.
- Route
GET /v1/onchain/tokens/screener- MCP
token_screener- Windows
- 24h, 7d, 30d, 90d
Fields
| Field | Type | Description |
|---|---|---|
token_address | string | Token contract, 0x-prefixed |
symbol | string|null | Symbol, when the token is known |
name | string|null | Name, when the token is known |
volume_usd | number | USD moved in the window, in and out |
net_flow_usd | number | USD in minus USD out; with sort=smart_inflow, the smart-money wallets' alone |
in_usd | number | USD received by wallets in the window |
out_usd | number | USD sent by wallets in the window |
unique_holders | integer | Wallets that sent or received it in the window |
tx_count | integer | Transfers counted |
Real rows
Token screener · rows
Load it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/screener?limit=10"
import os, requests
rows = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?limit=10",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
timeout=60,
).json()
for row in rows[:5]:
print(row)
import os, requests
import polars as pl
df = pl.DataFrame(requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?limit=10",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
timeout=60,
).json())
print(df.head())
Every parameter of /v1/onchain/tokens/screener → · back to the catalog
Top token holders by real balance
Who holds a token now, how much it is worth and what share of the supply.
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/holders?limit=20&sort=balance"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/holders?limit=20&sort=balance",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
# any MCP client; or from the terminal:
vike-data call token_holders --args '{"token_address": "0x6982508145454ce325ddbe47a25d4ec3d2311933", "sort": "balance", "limit": 20}'
| sort | ranks wallets by | each row adds |
|---|---|---|
balance | what they hold now, read from the chain | balance, value_usd, supply_pct |
flow (default) | all-time net inflow in USD: a flow, not a holding | — |
- By balance, the candidates are the top 150 wallets by net inflow and the top 150 by volume;
candidate_coveragesays how much of the supply they hold, andbalance_approximateis true below 20%. - Up to 50 holders, each with its label when known;
exclude_exchanges=trueleaves out exchange wallets. - CLI:
vike-data token holders <token>ranks by inflow; by balance, run the MCP tab'svike-data call.
Token holders
Holder leaderboard per token, ranked by cumulative net inflow in USD. With sort=balance, by the balance read from the chain.
- Route
GET /v1/onchain/tokens/{token_address}/holders- MCP
token_holders- Cadence
- Daily aggregates
- Coverage
- Top wallets by all-time net inflow of one token (USD at transfer time), with gross volume, transfer count, first and last active day and the wallet's label when known. limit up to 50. Find a token first with /tokens/search.
- Rows
Fields
| Field | Type | Description |
|---|---|---|
wallet | string | Holder, 0x-prefixed |
net_flow_usd | number | Inflow − outflow, USD — the ranking |
volume_usd | number | Inflow + outflow, USD |
tx_count | integer | Transfers counted |
first_seen | string | First active day, YYYY-MM-DD |
last_active | string | Last active day, YYYY-MM-DD |
entity | string | Resolved entity; empty when unlabelled |
wallet_type | string | Label type; empty when unlabelled |
balance | number | sort=balance: the balance read from the chain now, whole tokens |
value_usd | number|null | sort=balance: balance × the latest daily price; null when unpriced |
supply_pct | number|null | sort=balance: share of the total supply, in percent; null when the supply is unknown |
balance_basis | string | sort=balance: chain (read from the chain) or unsupported (a native coin: still ranked by inflow) |
balance_approximate | boolean | sort=balance: true when a balance could not be read, the supply is unknown or the candidates explain little of the supply |
candidate_coverage | number|null | sort=balance: share of the supply the candidate wallets hold, 0 to 1 |
Real rows
Token holders · rows
Load it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/holders?chain=ethereum&limit=10"
import os, requests
rows = requests.get(
"https://data.vike.io/v1/onchain/tokens/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/holders?chain=ethereum&limit=10",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
timeout=60,
).json()
for row in rows[:5]:
print(row)
import os, requests
import polars as pl
df = pl.DataFrame(requests.get(
"https://data.vike.io/v1/onchain/tokens/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/holders?chain=ethereum&limit=10",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
timeout=60,
).json())
print(df.head())
Every parameter of /v1/onchain/tokens/{token_address}/holders → · back to the catalog
Who bought and who sold it
The top net buyers or net sellers of a token in the last hour, day, week or month.
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/transfers?period=24h&tab=bought&hide_contracts=true"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/transfers?period=24h&tab=bought&hide_contracts=true",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data token transfers 0x6982508145454ce325ddbe47a25d4ec3d2311933 --period 24h --tab bought --hide-contracts
# any MCP client; or from the terminal:
vike-data call token_transfers --args '{"token_address": "0x6982508145454ce325ddbe47a25d4ec3d2311933", "period": "24h", "tab": "bought", "hide_contracts": true}'
tab=bought: the wallets that bought more than they sold;tab=sold(the default): the reverse. Largest first, by net USD.period:1h,24h,7d,30d;chain=alladds up the four chains.net_usdis USD received minus USD spent, so a buyer's is negative.hide_contracts=trueleaves out the pools, routers and other contracts we know of.min_amount/max_amount: count only the transfers of at least / at most this many whole tokens, each one kept or dropped before a wallet's totals are added up. E.g.…/transfers?period=24h&tab=bought&min_amount=1000000000ranks the buyers on PEPE transfers of 1,000,000,000 or more.
Token transfers
Who bought and who sold a token over a period, aggregated from raw transfers.
- Route
GET /v1/onchain/tokens/{token_address}/transfers- MCP
token_transfers- Cadence
- Synced block by block
- Coverage
- Per-token buyer and seller totals over a period (period, tab=bought|sold, chain) on Ethereum, BNB Chain, Base and HyperEVM — chain=ethereum|bsc|base|hyperevm is a filter, not a namespace. Per-wallet transfer lists at
/wallets/{address}/transactionscover the same four chains. Amount and USD fields on this route are whole tokens and plain USD (they were integers scaled by 10^6 until 2026-10-13). - Rows
Fields
| Field | Type | Description |
|---|---|---|
address | string | Wallet, 0x-prefixed |
bought | number | Tokens received, whole tokens |
sold | number | Tokens sent, whole tokens |
net_tokens | number | bought − sold, whole tokens |
usd_spent | number | USD value of tokens received, in USD |
usd_received | number | USD value of tokens sent, in USD |
net_usd | number | usd_received − usd_spent, in USD |
net_usd_raw | number | net_usd rounded to cents |
chains | array | Chain tags the wallet traded on, e.g. eth |
title | string|null | Known wallet title, when one exists |
addr_short | string | Display form, 0xabcd...1234 |
bought_fmt | string | Display string of bought |
sold_fmt | string | Display string of sold |
net_tokens_fmt | string | Display string of |net_tokens| |
usd_spent_fmt | string | Display string of usd_spent |
usd_received_fmt | string | Display string of usd_received |
net_usd_fmt | string | Display string of net_usd |
net_bar_pct | integer | |net_usd| as a percent of the page's largest |
Real rows
Token transfers · rows
Load it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/tokens/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/transfers?period=24h&chain=ethereum"
import os, requests
rows = requests.get(
"https://data.vike.io/v1/onchain/tokens/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/transfers?period=24h&chain=ethereum",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
timeout=60,
).json()
for row in rows[:5]:
print(row)
import os, requests
import polars as pl
df = pl.DataFrame(requests.get(
"https://data.vike.io/v1/onchain/tokens/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/transfers?period=24h&chain=ethereum",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
timeout=60,
).json())
print(df.head())
Every parameter of /v1/onchain/tokens/{token_address}/transfers → · back to the catalog
Every big transfer of a token, live
Subscribe once; filter by token, size, wallet or the label of either side.
import json, os
from websockets.sync.client import connect
with connect("wss://stream.vike.io/v1/stream/onchain",
additional_headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}) as ws:
ws.send(json.dumps({"action": "subscribe", "id": "pepe", "channel": "chain.transfers",
"filter": {"token": "0x6982508145454ce325ddbe47a25d4ec3d2311933", "min_usd": 100000}}))
for message in ws:
frame = json.loads(message)
if frame["type"] == "ping":
ws.send(json.dumps({"action": "pong"}))
elif frame["type"] == "event":
e = frame["event"]
print(e["subject"]["token_symbol"], e["data"]["amount"], e["data"]["value_usd"],
e["subject"]["from"], "->", e["subject"]["to"])
vike-data stream onchain --channel chain.transfers --filter token=0x6982508145454ce325ddbe47a25d4ec3d2311933 min_usd=100000
{
"action": "subscribe",
"id": "pepe",
"channel": "chain.transfers",
"filter": {
"token": "0x6982508145454ce325ddbe47a25d4ec3d2311933",
"min_usd": 100000
}
}
- Channel
chain.transfersatwss://stream.vike.io/v1/stream/onchain. - Filters:
wallet,token,chain,min_usd,min_amount,entity,wallet_type,contract.min_amountcounts whole tokens and needstoken. - Both sides of every transfer come with their label when we know it.
- Every filter, a real event and e-mail or webhook alerts with no code: Whale alerts.
7 token questions, answered with code
Each a question, the sentence to ask your AI agent, and the Python that answers it.
Find a token's contract address by name or ticker
Search a ticker or a token name and get the matching tokens on one chain, each with its 0x-prefixed contract address, from /tokens/search.
- Uses
/tokens/search,/tokens/{…}/holders- Verified
- live API, 2026-11-03: 5 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the contract address of PEPE on Ethereum
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=PEPE&limit=3",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# tokens whose name matches "Wrapped Ether"
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=Wrapped%20Ether&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the AERO token on Base
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=AERO&chain=base&limit=3",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the address alone
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=PEPE&limit=1",
headers={"X-API-Key": API_KEY},
)
# then: jq -r '.[0].token_address'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# PEPE's top accumulators, by the address the search returned
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/holders?limit=10",
headers={"X-API-Key": API_KEY},
)
Top holders of token X
Rank a token's top wallets by net inflow in USD, with labels: an approximation of the largest holders, not a balance.
- Uses
/tokens/{…}/holders,/wallets/{…}/balances- Verified
- live API, 2026-11-03: 5 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the five wallets with the largest accumulated net inflow of LINK
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x514910771af9ca656af840dff83e8264ecf986ca/holders?limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the longest ranking the route serves
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x514910771af9ca656af840dff83e8264ecf986ca/holders?limit=50",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# rows with no entity, the candidates for a closer look
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x514910771af9ca656af840dff83e8264ecf986ca/holders?limit=50",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.[] | select((.entity // "") == "") | {wallet, net_flow_usd, volume_usd, last_active}]'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# what a ranked wallet holds now on Ethereum, holdings of 1,000 USD and up
# WALLET: the top row of the ranking in the quick answer
holders = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x514910771af9ca656af840dff83e8264ecf986ca/holders?limit=5",
headers={"X-API-Key": API_KEY},
).json()
WALLET = holders[0]["wallet"]
r = requests.get(
f"https://data.vike.io/v1/onchain/wallets/{WALLET}/balances?chains=ethereum&min_usd=1000",
headers={"X-API-Key": API_KEY},
)
Who bought and who sold token X in the last 24h / 7d?
Screen Ethereum tokens for smart-money inflow, take the top token's biggest buyers and label them in one batch call, flagging the ones that are not exchanges, protocols or bots.
- Uses
/labels/batch,/tokens/screener,/tokens/{…}/transfers- Verified
- live API, 2026-11-03: 3 calls, all 200
The code
"""Who is buying the token smart money is moving into? Screen, take the top token, label its biggest buyers.
Run: VIKE_API_KEY=... python oc-early-buyers.py (--dry-run lists the requests and makes none)
"""
import os
import sys
from urllib.parse import urlencode
NAME = "oc-early-buyers"
BASE = "https://data.vike.io"
DRY = "--dry-run" in sys.argv
# Wallet types that are intermediaries, not an owner deciding to buy; everything else is worth a look.
PLUMBING = {"cex", "defi", "mev"}
def fail(why):
sys.exit(f"{NAME}: {why}")
def call(path, method="GET", **params):
url = BASE + path + ("?" + urlencode(params) if params else "")
if DRY:
print(method, url)
return None
key = os.environ.get("VIKE_API_KEY") or fail("set VIKE_API_KEY")
import requests
r = requests.request(method, url, headers={"X-API-Key": key}, timeout=60)
if r.status_code != 200:
fail(f"{method} {path} answered HTTP {r.status_code}: {r.text[:200]}")
return r.json()
def main():
# Ethereum by default. A token is keyed by address: the screener's symbol is null for a token outside our registry.
screen = call("/v1/onchain/tokens/screener", sort="smart_inflow", window="7d", limit=5)
# --dry-run has no response to read
rows = [{"token_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "volume_usd": 0}] if DRY else screen
# The zero address is the chain's native coin (ETH), which often tops the screen; /transfers lists no buyers for it.
rows = [r for r in rows or [] if int(r["token_address"], 16)]
if not rows:
fail("the screener returned no token contracts")
# Ten rows, one side per call, and no limit parameter. usd_spent and net_usd are plain USD.
for row in rows:
token = row["token_address"]
buyers = call(f"/v1/onchain/tokens/{token}/transfers", period="7d", tab="bought")
if DRY or buyers:
break
print(f"{token} has no buyers in the window, trying the next token")
else:
fail(f"none of the top {len(rows)} screened tokens has buyers in the window")
wallets = ["0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb", "0x06cff7088619c7178f5e14f0b119458d08d2f5ef"]
if not DRY:
print(f"top smart-money inflow over 7d: {token} (${row['volume_usd']:,.0f} volume)")
wallets = [b["address"] for b in buyers]
# A POST with no body: the addresses ride in the query string, at most 100 per call.
labels = call("/v1/onchain/labels/batch", method="POST", addresses=",".join(wallets))
if DRY:
return
if len(labels) != len(wallets):
fail(f"/labels/batch returned {len(labels)} rows for {len(wallets)} wallets")
by_wallet = {row["wallet"]: row for row in labels}
for b in buyers:
row = by_wallet.get(b["address"].lower(), {})
kind = (row.get("wallet_type") or "") if row.get("found") else ""
who = f"{row['entity']} ({kind})" if kind else "unlabelled"
# bought counts every transfer in, so a flash-loan loop or a router "buys" billions and keeps nothing
passed_on = b["net_tokens"] < 0.01 * b["bought"]
flag = " (passed it on)" if passed_on else "" if kind in PLUMBING else " <- look here"
print(f" {b['address']} bought ${b['usd_spent']:,.0f} kept {b['net_tokens']:,.0f} {who}{flag}")
if __name__ == "__main__":
try:
main()
except Exception as e: # a shape the example does not expect fails by name, not by traceback
fail(f"{type(e).__name__}: {e}")
Is smart money exiting token X?
Screen Ethereum tokens with smart_money_only=true, find token X in the list and read net_flow_usd; negative over 7 and 30 days means the cohort sent out more of it than it received.
- Uses
/tokens/screener- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# smart-money flow in PEPE over 7 days, picked out of the top 100 tokens by cohort volume
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?smart_money_only=true&sort=volume&window=7d&limit=100",
headers={"X-API-Key": API_KEY},
)
# then: jq '.[] | select(.token_address == "0x6982508145454ce325ddbe47a25d4ec3d2311933") | {token_address, symbol, net_flow_usd, volume_usd, in_usd, out_usd, unique_holders}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the same row over 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?smart_money_only=true&sort=volume&window=30d&limit=100",
headers={"X-API-Key": API_KEY},
)
# then: jq '.[] | select(.token_address == "0x6982508145454ce325ddbe47a25d4ec3d2311933") | {token_address, symbol, net_flow_usd, volume_usd, in_usd, out_usd, unique_holders}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# tokens the cohort sent out on net over 7 days
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?smart_money_only=true&sort=volume&window=7d&limit=100",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.[] | select(.net_flow_usd < 0) | {symbol, token_address, net_flow_usd, volume_usd}] | sort_by(.net_flow_usd)'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the tokens the cohort bought most on net over 7 days
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?sort=smart_inflow&window=7d&limit=20",
headers={"X-API-Key": API_KEY},
)
Which holders of a token have not moved in months? (diamond hands)
Rank a token's top 50 wallets by net inflow with /tokens/{token_address}/holders and keep the unlabelled ones whose last_active date is months old, then confirm the balance.
- Uses
/labels/batch,/tokens/{…}/holders,/wallets/{…}/balances- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# PEPE's top 50 accumulators, keeping the unlabelled ones that have not moved PEPE since 1 December 2025
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/holders?limit=50",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.[] | select(.entity == "" and .last_active < "2025-12-01")]'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the full holder ranking
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/holders?limit=50",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# what the dormant wallet holds on Ethereum now
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xcbc9fad51b83a50dbdc058704fe1355d7b13068d/balances?chains=ethereum&min_usd=1000",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# labels for the dormant candidates
r = requests.post(
"https://data.vike.io/v1/onchain/labels/batch?addresses=0xcbc9fad51b83a50dbdc058704fe1355d7b13068d,0xe8f2c2d63443a0e403ba35c95dafe513eedbae12,0xd7f9f54194c633f36ccd5f3da84ad4a1c38cb2cb",
headers={"X-API-Key": API_KEY},
)
PEPE on-chain analytics: top holders, whales, buyers and sellers
Resolve the token with /tokens/search, rank its biggest accumulators with /tokens/{token_address}/holders, and read the period's top buyers and sellers with /tokens/{token_address}/transfers.
- Uses
/tokens/search,/tokens/{…}/holders,/tokens/{…}/transfers- Verified
- live API, 2026-11-03: 5 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# PEPE's 50 biggest accumulators on Ethereum, with labels
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/holders?limit=50",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the PEPE contract on Ethereum
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=PEPE&limit=3",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the 24h buyers, first three rows, presentation strings dropped
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/transfers?period=24h&tab=bought",
headers={"X-API-Key": API_KEY},
)
# then: jq '.[:3] | map({address, bought, sold, net_tokens, net_usd})'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the 24h sellers
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x6982508145454ce325ddbe47a25d4ec3d2311933/transfers?period=24h&tab=sold",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the 24h sellers of AERO on Base
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/0x940181a94a35a4569e4529a3cdfb74e38fd98631/transfers?period=24h&tab=sold&chain=base",
headers={"X-API-Key": API_KEY},
)
Which tokens are flowing into Base but out of Ethereum? (cross-chain flows)
Rank Base tokens by net inflow with /tokens/screener, then read the same tokens' signed net flow on Ethereum; a token's net flow on a chain is the supply minted there minus the supply burned, in USD.
- Uses
/tokens/screener,/tokens/search- Verified
- live API, 2026-11-03: 5 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the Base tokens that gained the most supply, in USD, over the 7-day window
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?chain=base&sort=net_inflow&window=7d&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# Ethereum's 100 busiest tokens over the same window, each with its signed net flow
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?chain=ethereum&sort=volume&window=7d&limit=100",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the 100 Base tokens with the largest net inflow over 7 days
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?chain=base&sort=net_inflow&window=7d&limit=100",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the BNB Chain tokens that gained the most supply over 7 days
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/screener?chain=bsc&sort=net_inflow&window=7d&limit=20",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the contract address of MORPHO on Base
r = requests.get(
"https://data.vike.io/v1/onchain/tokens/search?q=MORPHO&chain=base&limit=3",
headers={"X-API-Key": API_KEY},
)