Crypto wallet tracker API: balances, transfers and PnL
Paste any wallet and see what it holds and whether it is in profit: every token it bought and sold, its average buy price, realized and unrealized PnL, what it holds now on Ethereum, BNB Chain, Base and HyperEVM, every transfer and its daily net flow. Ask your AI, get an e-mail when it moves, or call it from code on one free key.
“What does vitalik.eth hold, at what average buy price, and is it in profit on each token?”
wallet_positions“Show every transfer of 0x28c6c06298d514db089934071355e5743bf21d60 over $100,000 this week, and e-mail me when it moves again.”
wallet_transactions alerts_createWhat a wallet holds, and whether it is in profit
Token by token: what it bought and sold, its average buy price, realized and unrealized PnL. Near-live; the lifetime totals are updated nightly at 04:00 UTC.
Positions and real PnL, token by token
- Route
GET /v1/onchain/wallets/{address}/positions- CLI
- —
- MCP
wallet_positions· 2 credits- Cost
- 1 request of the hourly limit
A wallet's per-token positions with real profit and loss. Per token: bought and sold quantity and USD, average buy and sell price, realized PnL, the balance read from the chain now, the latest price, the current value and unrealized PnL (balance × (price − average buy price), null when either is unknown). Realized PnL is average cost over the wallet's priced inbound and outbound transfers: only units that were bought are realized, and the chain's coin and its wrapped token are one position under the zero address. totals sum every token the wallet traded; as_of is when its lifetime PnL in the wallet rankings was last recomputed (updated nightly at 04:00 UTC). For a daily net-flow series see /wallets/{address}/pnl.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Wallet address, 0x-prefixed hex |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
sort | query | realized | unrealized | value. Default realized. Positions whose value is unknown sort last |
order | query | desc (biggest first) | asc (biggest losses first). Default desc |
limit | query | Positions returned. Default 20, max 100. totals always cover every token |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/positions?sort=value&limit=8"
import os, requests
address = "0xd8da6bf26964af9d7eed9e03e53415d37aa96045" # vitalik.eth
r = requests.get(
f"https://data.vike.io/v1/onchain/wallets/{address}/positions",
params={"sort": "value", "limit": "8"},
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
).json()
t = r["totals"]
print("realized", t["realized_pnl_usd"], "unrealized", t["unrealized_pnl_usd"], "as of", t["as_of"])
for p in r["positions"]:
print(p["symbol"], "avg buy", p["avg_buy_price"], "realized", p["realized_pnl_usd"],
"value", p["value_usd"], "unrealized", p["unrealized_pnl_usd"])
# any MCP client; or from the terminal:
vike-data call wallet_positions --args '{"address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "sort": "value", "limit": 8}'
A real answer: vitalik.eth on ethereum
GET /v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/positions?sort=value&limit=8 · captured 2026-11-03
| Token | Bought | Avg buy price | Sold | Realized PnL | Value now | Unrealized PnL |
|---|---|---|---|---|---|---|
| ETH | $47,544,348 | $3,389 | $82,336,233 | −$34,437,745 | $16,475 | −$8,082 |
| ENS | $53,335 | $46.62 | $0 | $0 | $5,550 | −$47,786 |
| AZTEC | $20.72 | $0.01404 | $10.74 | −$0.34 | $9.96 | $0.31 |
| LRC | $215.37 | $0.2153 | $0 | $0 | $8.75 | −$206.62 |
| GALA | $109.60 | $0.03236 | $0 | $0 | $5.67 | −$103.93 |
| LPT | $0.56 | $0.2435 | $0 | $0 | $3.16 | $2.60 |
| HOT | $14.16 | $0.002509 | $0 | $0 | $3.05 | −$11.11 |
| TSLAON | $2.16 | $380.14 | $0 | $0 | $2.31 | $0.14 |
The JSON
{
"address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
"chain": "ethereum",
"found": true,
"sort": "value",
"order": "desc",
"totals": {
"realized_pnl_usd": -34241788.39,
"unrealized_pnl_usd": -56313.24,
"tokens_traded": 51,
"tokens_profitable": 8,
"as_of": "2026-11-03T03:00:00Z"
},
"positions": [
{
"token_address": "0x0000000000000000000000000000000000000000",
"symbol": "ETH",
"name": "ETH",
"bought_qty": 14029.946232,
"bought_usd": 47544347.7,
"sold_qty": 88136.715597,
"sold_usd": 82336232.74,
"avg_buy_price": 3388.7761876444088,
"avg_sell_price": 934.1876672704896,
"realized_pnl_usd": -34437744.96,
"balance": 7.24653779569616,
"price_usd": 2273.5,
"value_usd": 16475.0,
"unrealized_pnl_usd": -8081.89
},
{
"token_address": "0xc18360217d8f7ab5e7c516566761ea12ce7f9d72",
"symbol": "ENS",
"name": "Ethereum Name Service",
"bought_qty": 1144.036075,
"bought_usd": 53335.34,
"sold_qty": 0.0,
"sold_usd": 0.0,
"avg_buy_price": 46.62033314290373,
"avg_sell_price": null,
"realized_pnl_usd": 0.0,
"balance": 1144.0360760636715,
"price_usd": 4.851,
"value_usd": 5549.72,
"unrealized_pnl_usd": -47785.62
}
]
}
The first 2 of the 8 positions this call returned; `totals` cover all 51 tokens the wallet traded.
Track a wallet without writing code
Paste an address: open it on vike.io, or get an e-mail every time it moves.
Open the wallet
Its balances, profit, transfers and counterparties on one page, on the site.
Get an e-mail when it moves
Every transfer in or out of the wallet, by e-mail or webhook, from a dollar size up if you like, or for one token from an amount in tokens up. One chain per alert: pick it on the form.
Volume, flows and net flow, 24 hours to all time
One call for the five windows; a second for the day-by-day net flow.
Wallet summary & PnL
A wallet's volume, inflow, outflow and net flow per window, and a daily net-flow series.
- Routes
/v1/onchain/wallets/{address},/v1/onchain/wallets/{address}/pnl- Built on
- Token transfers
- MCP
wallet_summary
A real answer
Wallet summary · /wallets/{address}
GET /v1/onchain/wallets/{address} · Volume, inflow, outflow and net flow, 24 hours to all time
- CLI
vike-data wallet summary- MCP
wallet_summary· 2 credits- Cost
- 1 request of the hourly limit
Aggregate metrics for one wallet — volume, inflow, outflow, net flow, transaction count and tokens traded, across the 24h / 7d / 30d / 90d / all windows in a single response. tokens_traded counts the distinct tokens moved within each window. chain in the response says which chain answered.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Wallet address, 0x-prefixed hex |
chain | query | ethereum | bsc | base | hyperevm. Omit for the more recently active of ethereum and bsc; base or hyperevm is then answered only for a wallet with no priced ethereum/bsc volume |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet summary 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
# any MCP client; or from the terminal:
vike-data call wallet_summary --args '{"address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"}'
GET /v1/onchain/wallets/{address}/pnl · Daily net flow, day by day
- CLI
vike-data wallet pnl-history- MCP
wallet_pnl_history· 2 credits- Cost
- 1 request of the hourly limit
A daily net-flow series for the wallet — per-day net inflow USD, a cumulative figure, gross volume and transaction count.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Wallet address |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
days | query | Days back. Default 30, clamped to the range 1–365 |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/pnl?days=30"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/pnl?days=30",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet pnl-history 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --days 30
# any MCP client; or from the terminal:
vike-data call wallet_pnl_history --args '{"address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "days": 30}'
What it holds now, on Ethereum, BNB Chain, Base and HyperEVM
Read from the chain when you ask, with a USD value where the token is priced.
Wallet balances
A wallet's current token balances on Ethereum, BNB Chain, Base and HyperEVM, fetched from the chain at request time, with a USD value where the token is priced.
- Routes
/v1/onchain/wallets/{address}/balances- Built on
- Token transfers
- MCP
wallet_token_balances
GET /v1/onchain/wallets/{address}/balances · Current balances, read from the chain
- CLI
vike-data wallet balances- MCP
wallet_token_balances· 3 credits- Cost
- 1 request of the hourly limit
Current token balances for a wallet on Ethereum, BSC, Base and HyperEVM, read from the chain at request time, with a USD value where the token is priced. On base and hyperevm only the tokens we map and price carry a symbol, balance and USD value; any other held token is listed by address and balance_raw only with min_usd=0. HyperCore (spot and perp accounts) is not included.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Wallet address, 0x-prefixed, exactly 42 characters |
chains | query | Comma-separated. ethereum, bsc, base and hyperevm; the aliases eth, mainnet, bnb and binance are accepted. Omit for all four. Any other chain is reported in chain_errors; a chain whose read failed is listed there too and not in chains_scanned. |
min_usd | query | Hide holdings worth less than this. Omitted resolves to 1 (USD); an explicit 0 filters nothing and lists every holding. ⚠ Any floor above 0 also excludes holdings we cannot price, since an unpriced holding cannot be shown to clear it. The chain's native coin is the exception: it is always listed (when its balance is not zero), priced where a price exists, whatever the floor. |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/balances?min_usd=100"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/balances?min_usd=100",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet balances 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --min-usd 100
# any MCP client; or from the terminal:
vike-data call wallet_token_balances --args '{"address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "min_usd": 100}'
Every transfer of a wallet
In or out, from a dollar size or a token amount up, one token or all.
Every transfer, filtered by direction, size and token
- Route
GET /v1/onchain/wallets/{address}/transactions- CLI
vike-data wallet transactions- MCP
wallet_transactions· 2 credits- Cost
- 1 request of the hourly limit
The raw transfer list for a wallet: individual transfers, not aggregates. The forensic route. Each row carries the token's symbol and amount in whole tokens (the amount min_amount and max_amount filter on; null when the token's decimals are unknown) beside its USD value.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Wallet address |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
direction | query | in | out. Omit for both directions |
days | query | Days back. Default 30, clamped to 365 |
min_usd | query | Drop transfers below this USD value. Default 0 |
token_address | query | Restrict to a single token contract |
min_amount | query | Only transfers of at least this many tokens, in whole tokens (not raw units), up to 1e18. Needs token_address: an amount across different tokens means nothing, so without it this is a 400, as it is when that token's decimals are unknown. With min_usd, both must hold |
max_amount | query | Only transfers of at most this many tokens, in whole tokens, up to 1e18. Same rules as min_amount; a max_amount below min_amount is a 400 |
limit | query | Route default 100; applied cap 500 |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0x28c6c06298d514db089934071355e5743bf21d60/transactions?direction=out&days=7&min_usd=100000"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28c6c06298d514db089934071355e5743bf21d60/transactions?direction=out&days=7&min_usd=100000",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet transactions 0x28c6c06298d514db089934071355e5743bf21d60 --direction out --days 7 --min-usd 100000
# any MCP client; or from the terminal:
vike-data call wallet_transactions --args '{"address": "0x28c6c06298d514db089934071355e5743bf21d60", "direction": "out", "days": 7, "min_usd": 100000}'
token_address with min_amount and max_amount, in whole tokens, keeps the transfers of one token in a size range; with min_usd as well, both must hold. Every row carries the token's symbol and its amount in whole tokens. Here: Binance 14's USDT transfers of 100,000 or more in the last 7 days.
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0x28c6c06298d514db089934071355e5743bf21d60/transactions?days=7&token_address=0xdac17f958d2ee523a2206206994597c13d831ec7&min_amount=100000"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28c6c06298d514db089934071355e5743bf21d60/transactions?days=7&token_address=0xdac17f958d2ee523a2206206994597c13d831ec7&min_amount=100000",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
A transaction by its hash, and the money trail hop by hop: Transactions →
Wallets worth tracking
The most active and most profitable wallets in a window.
The most active and most profitable wallets
- Route
GET /v1/onchain/wallets/discover- CLI
vike-data wallet discover- MCP
wallet_discover· 2 credits- Cost
- 1 request of the hourly limit
Leaderboard of active wallets. Every USD value is in plain dollars. realized_pnl and tokens_profitable are lifetime figures in every window (realized_pnl_basis: "lifetime"), so sort=pnl ranks by lifetime PnL whatever window is.
Parameters
| Parameter | In | Description |
|---|---|---|
window | query | 24h | 7d | 30d | 90d | all. Default 30d; base and hyperevm default to all and serve the other windows only while those windows were refreshed in the last 2 days, otherwise a 400 |
sort | query | volume | inflow | outflow | net_flow | tx_count | pnl. Default volume |
order | query | asc | desc. Default desc |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
size | query | Results per page. Default 10, max 20 — one of the two routes in this namespace whose accepted and applied caps agree, alongside /tokens/search |
include_hubs | query | Boolean, default false. Also rank round-trip hubs (flash-loan, MEV and router pass-through wallets: volume of $10B or more, with net flow and realized PnL each within 0.1% of it), which are hidden by default |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/discover?window=7d&sort=pnl&size=10"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/discover?window=7d&sort=pnl&size=10",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet discover --window 7d --sort pnl --size 10
# any MCP client; or from the terminal:
vike-data call wallet_discover --args '{"window": "7d", "sort": "pnl", "size": 10}'
Follow a wallet live
Every new transfer of the wallet, the moment it lands.
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": "w1", "channel": "chain.transfers",
"filter": {"wallet": ["0xd8da6bf26964af9d7eed9e03e53415d37aa96045"]}}))
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"]
s, d = e["subject"], e["data"]
print(e["chain"], s["from"], "->", s["to"], d["amount"], s["token_symbol"], d["value_usd"], s["tx_hash"])
vike-data stream onchain --channel chain.transfers --filter wallet=0xd8da6bf26964af9d7eed9e03e53415d37aa96045
{
"action": "subscribe",
"id": "w1",
"channel": "chain.transfers",
"filter": {
"wallet": [
"0xd8da6bf26964af9d7eed9e03e53415d37aa96045"
],
"min_usd": 1000
}
}
- Channel
chain.transfersatwss://stream.vike.io/v1/stream/onchain. walletmatches the wallet on either side of a transfer, up to 1,000 wallets on one subscription.- Filters:
wallet,token,chain,min_usd,min_amount,entity,wallet_type,contract. - Each event carries both sides with their labels, the token, the amount and its dollar value.
- The channel's fields and a real event: Whale alerts. Every tool for your AI: AI.
Questions about a wallet, answered with code
Each with the sentence to ask your AI instead. Every block was run against the live API on 2026-11-03.
Decode a whale: accumulating, distributing or market making?
Read the net flow per window from /wallets/{address} for the direction, then the wallet's label from /labels/batch; known market makers carry a label, but market making is not detected from behaviour.
- Uses
/labels/batch,/wallets/{…},/wallets/{…}/pnl,/wallets/{…}/transactions- 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
# net flow per window for a large wallet, here a Wintermute address
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# who the wallet is: entity, wallet_type and risk_flag
r = requests.post(
"https://data.vike.io/v1/onchain/labels/batch?addresses=0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the daily net flow over 90 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4/pnl?days=90",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the wallet's USDT transfers over 30 days, newest first
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4/transactions?token_address=0xdac17f958d2ee523a2206206994597c13d831ec7&days=30&limit=500",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the same windows for vitalik.eth
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
headers={"X-API-Key": API_KEY},
)
Daily net-flow history of a wallet
One point per active day with that day's net inflow in USD, a running total, gross volume and transfer count, from /wallets/{address}/pnl; it is net flow, not realized PnL.
- Uses
/wallets/{…},/wallets/{…}/pnl- 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
# vitalik.eth's daily net flow on Ethereum over the last 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/pnl?days=30",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# a year of daily net flow
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/pnl?days=365",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the same wallet's daily net flow on Base
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/pnl?chain=base&days=90",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# date and cumulative net flow, one row per active day
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/pnl?days=90",
headers={"X-API-Key": API_KEY},
)
# then: jq '.series | map({date, cumulative_net_flow_usd})'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# net flow, inflow and outflow per window in one response
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
headers={"X-API-Key": API_KEY},
)
How much USDC was paid to an x402 server (AI-agent payments) on Base?
Pass the server's payTo address with chain=base for the USD it received per window, and list the USDC payments.
- Uses
/wallets/{…},/wallets/{…}/counterparties,/wallets/{…}/transactions- 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
# USD received by an x402 server's payTo address on Base, per window
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xe9030014F5DAe217d0A152f02A043567b16c1aBf?chain=base",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the newest USDC payments to the server on Base
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xe9030014F5DAe217d0A152f02A043567b16c1aBf/transactions?chain=base&direction=in&token_address=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&days=30&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
# USDC payments of at least 1 USD over 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xe9030014F5DAe217d0A152f02A043567b16c1aBf/transactions?chain=base&direction=in&token_address=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&min_usd=1&days=30&limit=500",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the server's top counterparties on Base over 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xe9030014F5DAe217d0A152f02A043567b16c1aBf/counterparties?chain=base&window=30d&limit=20",
headers={"X-API-Key": API_KEY},
)
Wallet activity summary: volume, inflow and outflow from 24h to all time
A wallet's volume, inflow, outflow, net flow and transfer count for 24h, 7d, 30d, 90d and all time, in one response from /wallets/{address}.
- Uses
/wallets/{…}- 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
# vitalik.eth's activity in every window, one response
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the same wallet on Base
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045?chain=base",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# one row per window
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
headers={"X-API-Key": API_KEY},
)
# then: jq 'del(.chain) | to_entries | map({window: .key, inflow: .value.total_inflow, outflow: .value.total_outflow, net: .value.net_flow})'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# Binance 14's windows
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60",
headers={"X-API-Key": API_KEY},
)
Wallet portfolio now across chains, in USD, no dust
Current balances on Ethereum, BNB Chain, Base and HyperEVM, read from the chain at request time by /wallets/{address}/balances; min_usd hides token holdings worth less than a USD floor.
- Uses
/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
# what vitalik.eth holds right now on all four chains, token holdings under 1,000 USD hidden
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/balances?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
# Ethereum and Base only
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/balances?chains=ethereum,base&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
# the complete list on Base
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/balances?chains=base&min_usd=0",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the ten most valuable holdings across all four chains
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/balances?min_usd=1",
headers={"X-API-Key": API_KEY},
)
# then: jq '.holdings[:10] | map({chain, symbol, balance, usd_value})'
Wallet transfer history: in/out, min USD, one token
A wallet's individual token transfers on Ethereum, BNB Chain, Base or HyperEVM, newest first, filtered by direction, days back, a USD floor and one token contract.
- Uses
/wallets/{…}/transactions- 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
# Binance 14's outgoing USDT transfers of at least 100,000 USD over the last 7 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/transactions?direction=out&token_address=0xdac17f958d2ee523a2206206994597c13d831ec7&min_usd=100000&days=7&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 newest 100 transfers in either direction over the default 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/transactions?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
# incoming transfers over 7 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/transactions?direction=in&days=7&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 newest 500 transfers within a year
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/transactions?days=365&limit=500",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the wallet's transfers on BNB Chain
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/transactions?chain=bsc&limit=50",
headers={"X-API-Key": API_KEY},
)
HyperEVM wallet analytics: counterparties, first funder, exchanges
Pass chain=hyperevm to /counterparties, /first-funder and /exchange-usage to see who a HyperEVM wallet deals with, what first arrived in it and which exchanges it uses.
- Uses
/wallets/discover,/wallets/{…}/counterparties,/wallets/{…}/exchange-usage,/wallets/{…}/first-funder- 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
# the HyperEVM wallet's top counterparties over 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xf8191d98ae98d2f7abdfb63a9b0b812b93c873aa/counterparties?chain=hyperevm&window=30d&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 wallet's earliest inbound coin and token on HyperEVM
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xf8191d98ae98d2f7abdfb63a9b0b812b93c873aa/first-funder?chain=hyperevm",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# which exchanges the wallet used over 90 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xf8191d98ae98d2f7abdfb63a9b0b812b93c873aa/exchange-usage?chain=hyperevm&window=90d",
headers={"X-API-Key": API_KEY},
)
# then: jq '{activity, exchanges: [.exchanges[] | {entity, sent_usd, recv_usd, transfers}], pattern}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the ten HyperEVM wallets with the largest volume, all recorded history
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/discover?chain=hyperevm&size=10",
headers={"X-API-Key": API_KEY},
)
Crypto wallet tracker FAQ
Is there a free crypto wallet tracker API?
How do I track a crypto wallet address?
/positions for profit per token, /balances for what it holds and /transactions for its transfers.Can I track a wallet's transactions in real time?
chain.transfers with a wallet filter: it matches the wallet on either side of a transfer, up to 1,000 wallets on one subscription. Or set an alert and get each transfer by e-mail or webhook.How is a wallet's profit worked out?
Is a daily net flow the same as profit?
/pnl is the money in minus the money out each day, a quick read of direction. Profit per token is /positions.