vike

Trace a wallet's funds

Follow the money — expand at each hop to the top counterparties by USD volume, outward, inward or both, up to a chosen depth.

GET https://data.vike.io/v1/onchain/wallets/{address}/trace

Follow the money. Starting at address, expand at each hop to the top width counterparties by USD volume, up to depth hops. direction picks which money: out follows where it went (each wallet's recipients), in where it came from (its senders), and both, the default, either way, ranked by the two summed; any other value is a 400. The response shape is {root, depth, width, nodes, edges, stats}, where nodes carry {address, depth, label, wallet_type, total_volume_usd} and edges carry {from, to, volume_usd, out_usd, in_usd, tx_count}, one edge per pair of wallets.

cURL
# follow an exchange wallet's money two hops from the root, both directions, three counterparties per hop, over 30 days
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?depth=2&width=3&window=30d"

# the defaults: 2 hops, 5 counterparties per hop, 30d, transfers of at least 10,000 USD, both directions
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace"

# only where the money went: each wallet's recipients, ranked by USD sent
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?direction=out&depth=2&width=3&window=30d"

# only where it came from: each wallet's senders, ranked by USD received
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?direction=in&depth=2&width=3&window=30d"

# one hop, as wide as the route goes: the ten biggest counterparties by USD volume
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?depth=1&width=10"

# include small transfers: min_usd=0 selects the 10,000 default, so pass a small positive floor instead
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?depth=1&width=5&min_usd=0.01"

# a deeper, narrower graph over a short window, to see where this week's money went (cost grows with depth times width)
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?depth=4&width=3&window=7d"

# who the graph reached, with their labels and distance from the root
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?depth=2&width=3&window=30d" \
  | jq '[.nodes[] | {address, depth, label, wallet_type}]'

# the same trace on BSC
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x28C6c06298d514Db089934071355E5743bf21d60/trace?chain=bsc&depth=2&width=3&window=30d"
addresspathrequired
Root wallet to trace from
chainqueryoptional
ethereum | bsc | base | hyperevm. Default ethereum
depthqueryoptional
Hops to follow. Default 2, clamped to 1–5
widthqueryoptional
Top N counterparties per hop. Default 5, clamped to 1–10
windowqueryoptional
24h | 7d | 30d | 90d | all. Default 30d
min_usdqueryoptional
Minimum USD per transfer to follow. Default 10,000
directionqueryoptional
out (where funds went) | in (where they came from) | both. Default both; anything else is a 400

A response for the Binance 14 hot wallet, captured 2026-10-19. The full response carries 7 nodes and 9 edges; the capture carries the root plus its three depth-1 nodes, the first three edges, and the closing stats block verbatim.

Example response
{
  "root": "0x28C6c06298d514Db089934071355E5743bf21d60",
  "depth": 2,
  "width": 3,
  "window": "30d",
  "min_usd": 10000.0,
  "nodes": [
    {
      "address": "0x28c6c06298d514db089934071355e5743bf21d60",
      "depth": 0,
      "total_volume_usd": 17594369380.10467,
      "label": "binance",
      "wallet_type": "cex"
    },
    {
      "address": "0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",
      "depth": 1,
      "total_volume_usd": 9591810600.94734,
      "label": "wintermute",
      "wallet_type": "market_maker"
    },
    {
      "address": "0x21a31ee1afc51d94c2efccaa2092ad1028285549",
      "depth": 1,
      "total_volume_usd": 6112217977.436004,
      "label": "binance",
      "wallet_type": "cex"
    },
    {
      "address": "0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
      "depth": 1,
      "total_volume_usd": 5631275918.408897,
      "label": "binance",
      "wallet_type": "cex"
    }
  ],
  "edges": [
    {
      "from": "0x28c6c06298d514db089934071355e5743bf21d60",
      "to": "0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",
      "volume_usd": 6993361528.77,
      "out_usd": 0.0,
      "in_usd": 6993361528.77,
      "tx_count": 8368
    },
    {
      "from": "0x28c6c06298d514db089934071355e5743bf21d60",
      "to": "0x21a31ee1afc51d94c2efccaa2092ad1028285549",
      "volume_usd": 5489601909.44,
      "out_usd": 5489601909.44,
      "in_usd": 0.0,
      "tx_count": 2658
    },
    {
      "from": "0x28c6c06298d514db089934071355e5743bf21d60",
      "to": "0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
      "volume_usd": 5111405941.9,
      "out_usd": 5111405941.9,
      "in_usd": 0.0,
      "tx_count": 2700
    }
  ],
  "stats": {
    "node_count": 7,
    "edge_count": 9,
    "max_depth_reached": 2
  }
}

What that summary shape does not tell you, all visible above:

  • The echoed request is part of the response. depth, width, window and the resolved min_usd come back at the top level, so a response records the floor it was taken under — useful given that omitting min_usd silently selects 10,000 rather than 0. direction is echoed beside them since 2026-10-20; the capture predates it and was taken under the default, both.
  • from is the wallet expanded first, not the sender. out_usd flowed from from to to, in_usd from to to from, and volume_usd is both. The first captured edge is in_usd only: wintermute sent Binance 14 $6.99B and nothing went back, because the default direction=both follows money arriving as well as leaving. Under direction=out every edge is out_usd only, under in every edge is in_usd only.
  • One edge per pair of wallets. Two wallets that each rank the other among their top width share one edge, so stats.edge_count counts relationships. Until 2026-10-19 such a pair came back twice, mirrored — this request then read 12 edges for 9 relationships.
  • total_volume_usd is the node's volume inside this graph, the sum of its edges here, not its whole activity: the root's 17.59B is its three edges, and wintermute's 9.59B adds the two edges of its own expansion to the one from the root.
  • depth=2, width=3 yielded 7 nodes, not the 1 + 3 + 9 = 13 the arithmetic suggests. A wallet is expanded once, however many neighbours name it, and only counterparties that clear min_usd count; read stats.node_count rather than predicting it. max_depth_reached tells you whether the graph ran out before depth did.

A misspelled window falls back silently; a misspelled chain does not

A misspelled window (or one the route does not take, such as 180d) reads 30 days with a 200 and no warning, so a typo returns plausible data for the wrong question. A misspelled direction is a 400, and so is a misspelled chain (chain 'x' not supported (use ethereum, bsc, base or hyperevm)). Spell window from the enum above.

Cost is the product of depth and width, so this is the heaviest route in the namespace; the MCP tool prices it at 4 credits against a namespace median of 2.

Example response
{  "root": "0x28C6c06298d514Db089934071355E5743bf21d60",  "depth": 2,  "width": 3,  "window": "30d",  "min_usd": 10000.0,  "nodes": [    {      "address": "0x28c6c06298d514db089934071355e5743bf21d60",      "depth": 0,      "total_volume_usd": 17594369380.10467,      "label": "binance",      "wallet_type": "cex"    },    {      "address": "0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",      "depth": 1,      "total_volume_usd": 9591810600.94734,      "label": "wintermute",      "wallet_type": "market_maker"    },    {      "address": "0x21a31ee1afc51d94c2efccaa2092ad1028285549",      "depth": 1,      "total_volume_usd": 6112217977.436004,      "label": "binance",      "wallet_type": "cex"    },    {      "address": "0xdfd5293d8e347dfe59e90efd55b2956a1343963d",      "depth": 1,      "total_volume_usd": 5631275918.408897,      "label": "binance",      "wallet_type": "cex"    }  ],  "edges": [    {      "from": "0x28c6c06298d514db089934071355e5743bf21d60",      "to": "0xeae7380dd4cef6fbd1144f49e4d1e6964258a4f4",      "volume_usd": 6993361528.77,      "out_usd": 0.0,      "in_usd": 6993361528.77,      "tx_count": 8368    },    {      "from": "0x28c6c06298d514db089934071355e5743bf21d60",      "to": "0x21a31ee1afc51d94c2efccaa2092ad1028285549",      "volume_usd": 5489601909.44,      "out_usd": 5489601909.44,      "in_usd": 0.0,      "tx_count": 2658    },    {      "from": "0x28c6c06298d514db089934071355e5743bf21d60",      "to": "0xdfd5293d8e347dfe59e90efd55b2956a1343963d",      "volume_usd": 5111405941.9,      "out_usd": 5111405941.9,      "in_usd": 0.0,      "tx_count": 2700    }  ],  "stats": {    "node_count": 7,    "edge_count": 9,    "max_depth_reached": 2  }}