Crypto transaction tracker: look up and trace any transfer
Paste a transaction hash and see what happened: whether it went through, who sent it, who received it, the fee and every token it moved, in dollars. Then follow the money hop by hop across Ethereum, BNB Chain, Base and HyperEVM. Ask your AI, or call it from code on one free key.
“What happened in transaction 0x0e4fdf7d3742366a474d7fc6baa538e4cad839eaa95f2c798403bd47deb795db? Did it go through, and who got the money?”
transaction_lookup“Where did the money in 0x84b38bc60f3bd82640ecefa320dab2be62e2da15 come from? Trace it three hops back.”
wallet_traceA transaction by its hash
Status, block and time, the sender and receiver with their labels, the fee and every token transfer, in dollars.
A transaction by its hash
- Route
GET /v1/onchain/transactions/{tx_hash}- CLI
- —
- MCP
transaction_lookup· 2 credits- Cost
- 1 request of the hourly limit
What happened in one transaction: status (success, failed, pending; unknown for Ethereum transactions before October 2017), block, time, from and to with their labels, the coin sent at the top level (value: whole coins, wei and USD), gas used and the fee, and every ERC-20 transfer in it (token_transfers: token, symbol, decimals, from and to with labels, amount in whole tokens and raw, USD). Each USD value carries usd_basis: transfer_time (the price at the transaction's minute) or latest_daily_price (only for a transaction from the last 24 hours not priced yet); null means no price. NFT transfers and internal transfers made by contract calls are not listed. found: false when the hash does not exist on that chain.
Parameters
| Parameter | In | Description |
|---|---|---|
tx_hashrequired | path | Transaction hash: 0x followed by 64 hex characters. Anything else is a 400 |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum. A hash looks the same on every chain: pass the one it was sent on |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/transactions/0x0e4fdf7d3742366a474d7fc6baa538e4cad839eaa95f2c798403bd47deb795db"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/transactions/0x0e4fdf7d3742366a474d7fc6baa538e4cad839eaa95f2c798403bd47deb795db",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
# any MCP client; or from the terminal:
vike-data call transaction_lookup --args '{"tx_hash": "0x0e4fdf7d3742366a474d7fc6baa538e4cad839eaa95f2c798403bd47deb795db"}'
A real answer captured 2026-11-03
| Status | success · block 7,870,430 · 2019-06-01 00:01:03 UTC |
|---|---|
| From | 0x11597f68a6302417e51aaa28d4b9999ae323e3eb · no label |
| To | 0xdac17f958d2ee523a2206206994597c13d831ec7 · tetherto (cex) |
| Coin sent | 0 ETH |
| Fee | 0.0004434885 ETH (23,465 gas) |
| Token transfer, log 26 | 139,312.8 USDT ($139,312.80, usd_basis transfer_time) from 0x11597f68a6302417e51aaa28d4b9999ae323e3eb · no label to 0x1062a747393198f70f71ec65a582423dba7e5ab3 · htx (cex, medium confidence) |
How to read it
status: failed: the transaction reverted, so neither its value nor any token moved; only the fee was paid. unknown: an Ethereum transaction from before October 2017 (no status recorded). pending: not in a block yet.token_transfers: Every ERC-20 Transfer event of the transaction, in log order. NFT transfers and coin moved by a contract call (internal transfers) are not listed. amount is in whole tokens (null when the token's decimals are unknown), amount_raw exact.usd_basis: transfer_time: the token's USD price at the minute of the transaction. latest_daily_price: the latest daily price, used only for a transaction from the last 24 hours that is not priced yet. null: no USD price.labels: A label is the chain's own consensus entity with the pipeline's classification confidence, not a certainty.
{
"tx_hash": "0x0e4fdf7d3742366a474d7fc6baa538e4cad839eaa95f2c798403bd47deb795db",
"chain": "ethereum",
"found": true,
"status": "success",
"block": 7870430,
"time": "2019-06-01T00:01:03Z",
"from": {
"address": "0x11597f68a6302417e51aaa28d4b9999ae323e3eb",
"label": null,
"wallet_type": null,
"label_confidence": null
},
"to": {
"address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"label": "tetherto",
"wallet_type": "cex",
"label_confidence": null
},
"value": {
"amount": 0.0,
"amount_wei": "0",
"symbol": "ETH",
"amount_usd": null,
"usd_basis": null
},
"fee": {
"gas_used": 23465,
"gas_price_wei": "18900000000",
"amount": 0.0004434885,
"amount_wei": "443488500000000",
"symbol": "ETH"
},
"token_transfers": [
{
"log_index": 26,
"token_address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"symbol": "USDT",
"decimals": 6,
"from": {
"address": "0x11597f68a6302417e51aaa28d4b9999ae323e3eb",
"label": null,
"wallet_type": null,
"label_confidence": null
},
"to": {
"address": "0x1062a747393198f70f71ec65a582423dba7e5ab3",
"label": "htx",
"wallet_type": "cex",
"label_confidence": "medium"
},
"amount": 139312.8,
"amount_raw": "139312800000",
"amount_usd": 139312.8,
"usd_basis": "transfer_time"
}
],
"coverage": {
"status": "failed: the transaction reverted, so neither its value nor any token moved; only the fee was paid. unknown: an Ethereum transaction from before October 2017 (no status recorded). pending: not in a block yet.",
"token_transfers": "Every ERC-20 Transfer event of the transaction, in log order. NFT transfers and coin moved by a contract call (internal transfers) are not listed. amount is in whole tokens (null when the token's decimals are unknown), amount_raw exact.",
"usd_basis": "transfer_time: the token's USD price at the minute of the transaction. latest_daily_price: the latest daily price, used only for a transaction from the last 24 hours that is not priced yet. null: no USD price.",
"labels": "A label is the chain's own consensus entity with the pipeline's classification confidence, not a certainty."
}
}
Every transfer of a wallet, filtered by direction, token, size and days back: Wallet tracker.
Follow the money
Where the money came from, where it went, who a wallet deals with, and whether two wallets are linked.
- Start where the money started
Who sent the wallet its first coins and its first priced tokens:
/wallets/{address}/first-funderon Wallet lookup. Not proof of who owns it: the sender can be an exchange or a relay. - Follow it hop by hop
/wallets/{address}/trace: inward to where it came from, outward to where it went, up to 5 hops, every wallet labelled. - See who it deals with
/wallets/{address}/counterparties: its biggest counterparties by dollar volume, with the amount each way. - Check two wallets
/wallets/compare: the counterparties and tokens two wallets share.
Counterparties, trace & compare
Who a wallet deals with: its top counterparties by transfer volume, a multi-hop trace of the money in, out or both, and the counterparties and tokens two wallets share, each with labels.
- Routes
/v1/onchain/wallets/{address}/counterparties,/v1/onchain/wallets/{address}/trace,/v1/onchain/wallets/compare- Built on
- Token transfers, Wallet labels
- MCP
wallet_counterparties
A real answer
Top counterparties · /wallets/{address}/counterparties
GET /v1/onchain/wallets/{address}/counterparties · Who a wallet deals with most
- CLI
vike-data wallet counterparties- MCP
wallet_counterparties· 2 credits- Cost
- 1 request of the hourly limit
The addresses this wallet transacted with most, by combined transfer volume over a window.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Wallet address |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
window | query | 24h | 7d | 30d | 90d | 180d | all. Default 30d |
limit | query | Route default 100; applied cap 50 |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0x176f3dab24a159341c0509bb36b833e7fdd0a132/counterparties?window=90d&limit=5"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x176f3dab24a159341c0509bb36b833e7fdd0a132/counterparties?window=90d&limit=5",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet counterparties 0x176f3dab24a159341c0509bb36b833e7fdd0a132 --window 90d --limit 5
# any MCP client; or from the terminal:
vike-data call wallet_counterparties --args '{"address": "0x176f3dab24a159341c0509bb36b833e7fdd0a132", "window": "90d", "limit": 5}'
GET /v1/onchain/wallets/{address}/trace · Follow the money, hop by hop
- CLI
vike-data wallet trace- MCP
wallet_trace· 4 credits- Cost
- 1 request of the hourly limit
Follow the money — expand at each hop to the top counterparties by USD volume, outward, inward or both, up to a chosen depth. Every node carries label, wallet_type and risk_flag (null when the address is unlabelled).
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | Root wallet to trace from |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
depth | query | Hops to follow. Default 2, clamped to 1–5 |
width | query | Top N counterparties per hop. Default 5, clamped to 1–10 |
window | query | 24h | 7d | 30d | 90d | all. Default 30d; anything else is a 400 |
min_usd | query | Minimum USD per transfer to follow. Default 10,000 |
direction | query | out (where funds went) | in (where they came from) | both. Default both; anything else is a 400 |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/0x84b38bc60f3bd82640ecefa320dab2be62e2da15/trace?depth=3&width=3&window=30d"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x84b38bc60f3bd82640ecefa320dab2be62e2da15/trace?depth=3&width=3&window=30d",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet trace 0x84b38bc60f3bd82640ecefa320dab2be62e2da15 --depth 3 --width 3 --window 30d
# any MCP client; or from the terminal:
vike-data call wallet_trace --args '{"address": "0x84b38bc60f3bd82640ecefa320dab2be62e2da15", "depth": 3, "width": 3, "window": "30d"}'
GET /v1/onchain/wallets/compare · Are two wallets linked?
- CLI
vike-data wallet compare- MCP
wallet_compare· 3 credits- Cost
- 1 request of the hourly limit
Are these two wallets related? Returns the counterparties both wallets transacted with and the tokens both touched, within a window.
Parameters
| Parameter | In | Description |
|---|---|---|
address_arequired | query | First wallet |
address_brequired | query | Second wallet |
chain | query | ethereum | bsc | base | hyperevm. Default ethereum |
window | query | 24h | 7d | 30d | 90d | 180d | all. Default 30d |
limit | query | Max shared items per category. Route default 100; applied cap 50 |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/onchain/wallets/compare?address_a=0x28c6c06298d514db089934071355e5743bf21d60&address_b=0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4&window=30d&limit=3"
import os, requests
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/compare?address_a=0x28c6c06298d514db089934071355e5743bf21d60&address_b=0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4&window=30d&limit=3",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data wallet compare 0x28c6c06298d514db089934071355e5743bf21d60 0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4 --window 30d --limit 3
# any MCP client; or from the terminal:
vike-data call wallet_compare --args '{"address_a": "0x28c6c06298d514db089934071355e5743bf21d60", "address_b": "0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4", "window": "30d", "limit": 3}'
9 studies
Questions people trace, each with the sentence to ask your AI instead. Every block was run against the live API on 2026-11-03.
Follow the money: trace a wallet's funds N hops
Follow a wallet's money two hops from the root at three counterparties per hop, then list the heaviest edges with their labels and direction.
- Uses
/wallets/{…}/trace- Verified
- live API, 2026-11-03: 1 calls, all 200
The code
"""Follow an exchange wallet's money two hops out and read who it reached.
Run: VIKE_API_KEY=... python oc-trace-money.py (--dry-run lists the requests and makes none)
"""
import os
import sys
from urllib.parse import urlencode
NAME = "oc-trace-money"
BASE = "https://data.vike.io"
DRY = "--dry-run" in sys.argv
ROOT = "0x28C6c06298d514Db089934071355E5743bf21d60" # the Binance 14 hot wallet
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():
# Cost grows with depth x width, so this is the heaviest route in the namespace: keep both small.
# min_usd defaults to 10,000 when omitted; the graph holds only transfers that clear it.
graph = call(f"/v1/onchain/wallets/{ROOT}/trace", depth=2, width=3, window="30d")
if DRY:
return
nodes = graph["nodes"]
if len(nodes) < 2:
fail("the trace reached nobody beyond the root")
names = {n["address"]: f"{n.get('label') or n['address'][:10]} ({n.get('wallet_type') or '?'})" for n in nodes}
print(f"{graph['stats']['node_count']} wallets, {graph['stats']['edge_count']} edges, "
f"{graph['stats']['max_depth_reached']} hop(s) reached, floor ${graph['min_usd']:,.0f} per transfer")
# An edge is a pair of wallets, not a one-way payment: out_usd and in_usd split the volume by direction.
for e in sorted(graph["edges"], key=lambda e: -e["volume_usd"])[:5]:
print(f" {names.get(e['from'], e['from'][:10])} <-> {names.get(e['to'], e['to'][:10])} "
f"out ${e['out_usd']:,.0f} in ${e['in_usd']:,.0f} {e['tx_count']} txs")
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}")
Where did this wallet's money come from? Trace inbound 3 hops
Call /wallets/{address}/trace with direction=in and depth=3; at each hop it follows the top senders by USD and returns the graph as labelled nodes and edges.
- Uses
/wallets/{…}/trace- 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
# who funded this wallet, who funded them, and one hop further, top 3 senders per hop over 30 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x84b38bc60f3bd82640ecefa320dab2be62e2da15/trace?direction=in&depth=3&width=3&window=30d",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# follow inbound transfers of 100 USD and up
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x84b38bc60f3bd82640ecefa320dab2be62e2da15/trace?direction=in&depth=3&width=3&window=30d&min_usd=100",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# inbound over all recorded history, two hops
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x84b38bc60f3bd82640ecefa320dab2be62e2da15/trace?direction=in&depth=2&width=3&window=all",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# every address the trace reached, with its hop and label
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x84b38bc60f3bd82640ecefa320dab2be62e2da15/trace?direction=in&depth=3&width=3&window=30d",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.nodes[] | {address, depth, label, wallet_type}]'
Where did the stolen funds go? Trace outbound from a hack address
Call /wallets/{address}/trace with direction=out, a high min_usd and window=all to follow a hack address's largest outgoing transfers hop by hop, with each wallet's label.
- Uses
/labels/batch,/wallets/{…}/counterparties,/wallets/{…}/trace- Verified
- live API, 2026-11-03: 6 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# where the Bybit exploiter's money went: two hops, three recipients per wallet, transfers of 100,000 USD and up
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2/trace?direction=out&depth=2&width=3&window=all&min_usd=100000",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# wider and deeper: three hops, ten recipients per wallet, all history
# (for a hack of the last month, window=30d keeps the trail to its fresh moves; this one dates from February 2025)
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2/trace?direction=out&depth=3&width=10&window=all&min_usd=100000",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# nodes whose wallet_type is not flagged
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2/trace?direction=out&depth=2&width=3&window=all&min_usd=100000",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.nodes[] | select(.wallet_type != "flagged") | {address, depth, label, wallet_type, total_volume_usd}]'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# entity, wallet_type and risk_flag of every node
# NODES: the comma-separated address list of the quick answer's trace
trace = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2/trace?direction=out&depth=2&width=3&window=all&min_usd=100000",
headers={"X-API-Key": API_KEY},
).json()
NODES = ",".join(n["address"] for n in trace["nodes"])
r = requests.post(
f"https://data.vike.io/v1/onchain/labels/batch?addresses={NODES}",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the hack address's top 50 counterparties by USD
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2/counterparties?window=all&limit=50",
headers={"X-API-Key": API_KEY},
)
Does a wallet's inbound trail touch a flagged or exchange entity?
Trace the wallet's senders two hops back with /wallets/{address}/trace?direction=in, read each node's label and wallet_type, then send the node list to /labels/batch for its risk_flag.
- Uses
/labels/batch,/wallets/{…}/trace- 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
# who sent money to this wallet over 90 days, and who sent money to them
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/trace?direction=in&depth=2&width=3&window=90d",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# entity, wallet_type and risk_flag for every wallet in the trail
# NODES: the comma-separated address list of the quick answer's trace
trace = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/trace?direction=in&depth=2&width=3&window=90d",
headers={"X-API-Key": API_KEY},
).json()
NODES = ",".join(n["address"] for n in trace["nodes"])
r = requests.post(
f"https://data.vike.io/v1/onchain/labels/batch?addresses={NODES}",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# address, depth, label and wallet_type of every node
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/trace?direction=in&depth=2&width=3&window=90d",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.nodes[] | {address, depth, label, wallet_type}]'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# three hops back, transfers of 1,000 USD and up
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/trace?direction=in&depth=3&width=3&window=90d&min_usd=1000",
headers={"X-API-Key": API_KEY},
)
Top counterparties of a wallet
Call /wallets/{address}/counterparties; it ranks the addresses the wallet sent to or received from by combined USD volume over a window, with the amount each way and labels.
- Uses
/wallets/{…}/counterparties- 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
# a large wallet's five biggest counterparties over 90 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x176f3dab24a159341c0509bb36b833e7fdd0a132/counterparties?window=90d&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 long-run ranking over all recorded history
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x176f3dab24a159341c0509bb36b833e7fdd0a132/counterparties?window=all&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 same address on BSC
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x176f3dab24a159341c0509bb36b833e7fdd0a132/counterparties?chain=bsc&window=90d&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
# just the counterparty addresses
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0x176f3dab24a159341c0509bb36b833e7fdd0a132/counterparties?window=90d&limit=50",
headers={"X-API-Key": API_KEY},
)
# then: jq -r '.[].wallet'
Is any of this wallet's top counterparties flagged or an exchange?
Take the wallet's top counterparties from /wallets/{address}/counterparties, then POST them to /labels/batch; wallet_type cex marks exchanges and a non-empty risk_flag marks flagged addresses.
- Uses
/labels/batch,/wallets/{…}/counterparties,/wallets/{…}/exchange-usage- 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
# label the wallet's top five counterparties in one call
r = requests.post(
"https://data.vike.io/v1/onchain/labels/batch?addresses=0xe731dfadbff20542e10d09d26fc71445c70d4232,0x44032bd442c5719ad4ffa123f8ec3d39c840f686,0x23617e59a5925b2a4bf75d73ff6711cd0b29de85,0x60594a405d53811d3bc4766596efd80fd545a270,0x998252ea9cb19b3fbc137e111d87808aafff08cf",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the top five counterparties over 90 days, joined with commas
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/counterparties?window=90d&limit=5",
headers={"X-API-Key": API_KEY},
)
# then: jq -r '[.[].wallet] | join(",")'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the counterparties labelled as exchanges, with the volume each way
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/counterparties?window=90d&limit=50",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.[] | select(.wallet_type == "cex") | {wallet, entity, sent_usd, received_usd}]'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# every labelled exchange the wallet sent to or received from over the same 90 days
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/exchange-usage?window=90d",
headers={"X-API-Key": API_KEY},
)
Who are the biggest users of a contract or protocol, and what are they worth?
Call /wallets/{contract}/counterparties for the addresses that moved the most USD to and from the contract, label them with /labels/batch, then read each one's holdings with /wallets/{address}/balances.
- Uses
/labels/batch,/wallets/{…}/balances,/wallets/{…}/counterparties- 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 five addresses that moved the most USD to and from the Chainlink staking pool, all history
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xbc10f2e862ed4502144c7d632a3459f49dfcdb5e/counterparties?window=all&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
# entity, wallet type and risk flag for the top counterparties
r = requests.post(
"https://data.vike.io/v1/onchain/labels/batch?addresses=0xedf03cd5075f93174614febf9c6789a3e7581d4c,0xd031c0d7b7996899d4712d50f33d2a539794d985,0xaa6d57e15af3d58feb0ea3f02cbb5319046a26e5",
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 second-ranked staker holds now, on all four chains, holdings of 1,000 USD and up
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xd031c0d7b7996899d4712d50f33d2a539794d985/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
# the top 50, keeping rows where one direction carries more than 60% of the volume
r = requests.get(
"https://data.vike.io/v1/onchain/wallets/0xbc10f2e862ed4502144c7d632a3459f49dfcdb5e/counterparties?window=all&limit=50",
headers={"X-API-Key": API_KEY},
)
# then: jq '[.[] | select(.sent_usd > 0.6 * .total_volume_usd or .received_usd > 0.6 * .total_volume_usd)]'