Schemas Get a free key
On-chain · Wallet tracker

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.

Ask your AI · Claude, ChatGPT, CursorConnect in a minute →

“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_create
Positions & PnL

What 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.

On-chain · REST · MCP

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
Free APIArchiveStreamMCP

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

ParameterInDescription
addressrequiredpathWallet address, 0x-prefixed hex
chainqueryethereum | bsc | base | hyperevm. Default ethereum
sortqueryrealized | unrealized | value. Default realized. Positions whose value is unknown sort last
orderquerydesc (biggest first) | asc (biggest losses first). Default desc
limitqueryPositions returned. Default 20, max 100. totals always cover every token

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/positions?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

Realized PnL −$34,241,788Unrealized PnL −$56,313Tokens traded 51In profit 8lifetime, as of 2026-11-03
TokenBoughtAvg buy priceSoldRealized PnLValue nowUnrealized 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

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.

No code

Track a wallet without writing code

Paste an address: open it on vike.io, or get an e-mail every time it moves.

The wallet
On vike.io · free, no key

Open the wallet

Its balances, profit, transfers and counterparties on one page, on the site.

Alert · every transfer

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.

Summary

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.

On-chain · API analytics

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
Free APIArchiveStreamMCP

A real answer

Wallet summary · /wallets/{address}

GET
Open this side to see the captured response.

    

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

ParameterInDescription
addressrequiredpathWallet address, 0x-prefixed hex
chainqueryethereum | 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

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/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

ParameterInDescription
addressrequiredpathWallet address
chainqueryethereum | bsc | base | hyperevm. Default ethereum
daysqueryDays back. Default 30, clamped to the range 1–365

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/pnl?days=30"
Balances

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.

On-chain · API analytics

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
Free APIArchiveStreamMCP

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

ParameterInDescription
addressrequiredpathWallet address, 0x-prefixed, exactly 42 characters
chainsqueryComma-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_usdqueryHide 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

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/balances?min_usd=100"
Transfers

Every transfer of a wallet

In or out, from a dollar size or a token amount up, one token or all.

On-chain · REST · CLI · MCP

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
Free APIArchiveStreamMCP

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

ParameterInDescription
addressrequiredpathWallet address
chainqueryethereum | bsc | base | hyperevm. Default ethereum
directionqueryin | out. Omit for both directions
daysqueryDays back. Default 30, clamped to 365
min_usdqueryDrop transfers below this USD value. Default 0
token_addressqueryRestrict to a single token contract
min_amountqueryOnly 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_amountqueryOnly 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
limitqueryRoute default 100; applied cap 500

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28c6c06298d514db089934071355e5743bf21d60/transactions?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.

bash
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"

A transaction by its hash, and the money trail hop by hop: Transactions →

Find wallets

Wallets worth tracking

The most active and most profitable wallets in a window.

On-chain · REST · CLI · MCP

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
Free APIArchiveStreamMCP

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

ParameterInDescription
windowquery24h | 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
sortqueryvolume | inflow | outflow | net_flow | tx_count | pnl. Default volume
orderqueryasc | desc. Default desc
chainqueryethereum | bsc | base | hyperevm. Default ethereum
sizequeryResults per page. Default 10, max 20 — one of the two routes in this namespace whose accepted and applied caps agree, alongside /tokens/search
include_hubsqueryBoolean, 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

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/discover?window=7d&sort=pnl&size=10"
Live

Follow a wallet live

Every new transfer of the wallet, the moment it lands.

python
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"])
  • Channel chain.transfers at wss://stream.vike.io/v1/stream/onchain.
  • wallet matches 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.
7 studies

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.

On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “Is 0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4 accumulating or distributing, and who is it?”

The code

python
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},
)
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “Show the daily net flow of vitalik.eth on Ethereum over the last 30 days”

The code

python
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},
)
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “How much USD did 0xe9030014F5DAe217d0A152f02A043567b16c1aBf receive on Base in the last 7 days?”

The code

python
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},
)
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “Give me the activity summary of vitalik.eth: volume, inflow and outflow for every window”

The code

python
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},
)
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “What does vitalik.eth hold right now across Ethereum, BNB Chain, Base and HyperEVM, ignoring anything under $1,000?”

The code

python
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},
)
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “List Binance 14's outgoing USDT transfers over $100,000 in the last 7 days”

The code

python
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},
)
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “Who are the top counterparties of 0xf8191d98ae98d2f7abdfb63a9b0b812b93c873aa on HyperEVM, who first funded it, and which exchanges does it use?”

The code

python
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},
)
FAQ

Crypto wallet tracker FAQ

Is there a free crypto wallet tracker API?
Yes. One free key tracks any wallet on Ethereum, BNB Chain, Base and HyperEVM: what it holds and its profit per token, its balances, every transfer and its daily net flow, over MCP, REST, the CLI and a live WebSocket, 20,000 requests an hour.
How do I track a crypto wallet address?
Without code: open it on vike.io, or create an alert and get an e-mail on every transfer. With AI: ask Claude or ChatGPT about the address. With code: /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?
Yes. Subscribe to 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?
At average cost, from the wallet's priced transfers in and out of each token: only units it bought count as realized, and unrealized PnL is the balance now times the latest price minus the average buy price. The chain's coin and its wrapped token are one position. Positions are near-live; the lifetime totals are updated nightly at 04:00 UTC.
Is a daily net flow the same as profit?
No. /pnl is the money in minus the money out each day, a quick read of direction. Profit per token is /positions.