Schemas Get a free key
On-chain · Transactions

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.

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

“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_trace
By hash

A transaction by its hash

Status, block and time, the sender and receiver with their labels, the fee and every token transfer, in dollars.

On-chain · REST · MCP

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

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

ParameterInDescription
tx_hashrequiredpathTransaction hash: 0x followed by 64 hex characters. Anything else is a 400
chainqueryethereum | bsc | base | hyperevm. Default ethereum. A hash looks the same on every chain: pass the one it was sent on

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/transactions/0x0e4fdf7d3742366a474d7fc6baa538e4cad839eaa95f2c798403bd47deb795db"

A real answer captured 2026-11-03

Statussuccess · block 7,870,430 · 2019-06-01 00:01:03 UTC
From0x11597f68a6302417e51aaa28d4b9999ae323e3eb · no label
To0xdac17f958d2ee523a2206206994597c13d831ec7 · tetherto (cex)
Coin sent0 ETH
Fee0.0004434885 ETH (23,465 gas)
Token transfer, log 26139,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.
json
{
 "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.

Crypto tracing

Follow the money

Where the money came from, where it went, who a wallet deals with, and whether two wallets are linked.

  1. Start where the money started

    Who sent the wallet its first coins and its first priced tokens: /wallets/{address}/first-funder on Wallet lookup. Not proof of who owns it: the sender can be an exchange or a relay.

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

  3. See who it deals with

    /wallets/{address}/counterparties: its biggest counterparties by dollar volume, with the amount each way.

  4. Check two wallets

    /wallets/compare: the counterparties and tokens two wallets share.

On-chain · API analytics

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

A real answer

Top counterparties · /wallets/{address}/counterparties

GET
Open this side to see the captured response.

    

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

ParameterInDescription
addressrequiredpathWallet address
chainqueryethereum | bsc | base | hyperevm. Default ethereum
windowquery24h | 7d | 30d | 90d | 180d | all. Default 30d
limitqueryRoute default 100; applied cap 50

Call it

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

ParameterInDescription
addressrequiredpathRoot wallet to trace from
chainqueryethereum | bsc | base | hyperevm. Default ethereum
depthqueryHops to follow. Default 2, clamped to 1–5
widthqueryTop N counterparties per hop. Default 5, clamped to 1–10
windowquery24h | 7d | 30d | 90d | all. Default 30d; anything else is a 400
min_usdqueryMinimum USD per transfer to follow. Default 10,000
directionqueryout (where funds went) | in (where they came from) | both. Default both; anything else is a 400

Call it

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

ParameterInDescription
address_arequiredqueryFirst wallet
address_brequiredquerySecond wallet
chainqueryethereum | bsc | base | hyperevm. Default ethereum
windowquery24h | 7d | 30d | 90d | 180d | all. Default 30d
limitqueryMax shared items per category. Route default 100; applied cap 50

Call it

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

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.

On-chain · API

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

The code

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

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
Free APIArchiveStreamMCP
Ask your AI agent: “Where did the money in 0x84b38bc60f3bd82640ecefa320dab2be62e2da15 come from? Trace it three hops back.”

The code

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

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
Free APIArchiveStreamMCP
Ask your AI agent: “Trace where the money from 0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2 went, two hops, transfers over $100,000, all history”

The code

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

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
Free APIArchiveStreamMCP
Ask your AI agent: “Did any of the wallets that funded 0x556e9d5d9e64638edde632bbd4810c9fd0d88397 in the last 90 days belong to an exchange or a flagged entity?”

The code

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

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
Free APIArchiveStreamMCP
Ask your AI agent: “Who are the top counterparties of 0x176f3dab24a159341c0509bb36b833e7fdd0a132 over the last 90 days?”

The code

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

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
Free APIArchiveStreamMCP
Ask your AI agent: “Are any of vitalik.eth's top counterparties over the last 90 days flagged or exchanges?”

The code

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

Do two wallets share an upstream funder?

Call /wallets/{address}/first-funder for each wallet and compare the senders; for funders further up, trace each wallet inbound and look for addresses both traces reach.

Uses
/wallets/compare, /wallets/{…}/first-funder, /wallets/{…}/trace
Verified
live API, 2026-11-03: 4 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Were 0x556e9d5d9e64638edde632bbd4810c9fd0d88397 and 0xdfd5293d8e347dfe59e90efd55b2956a1343963d funded by the same address?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# who sent the first ETH to wallet A, with the sender's label
r = requests.get(
    "https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/first-funder",
    headers={"X-API-Key": API_KEY},
)
# then: jq '.first_native_in | {from, label, wallet_type, time, amount, amount_symbol}'
On-chain · API

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
Free APIArchiveStreamMCP
Ask your AI agent: “Who are the biggest users of the contract 0xbc10f2e862ed4502144c7d632a3459f49dfcdb5e, and what do they hold now?”

The code

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

Crypto transaction tracker FAQ

How do I track a crypto transaction?
Paste its hash into GET /v1/onchain/transactions/{tx_hash}, or ask your AI, which calls transaction_lookup. You get whether it went through, the block and time, the sender and the receiver with their labels, the fee and every token transfer in it with its dollar value. It works on Ethereum, BNB Chain, Base and HyperEVM: pass chain= the one it was sent on.
How do I check whether a crypto transaction went through?
Read status. success: it went through. 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.
How do I trace where crypto went?
GET /v1/onchain/wallets/{address}/trace follows the money hop by hop, up to 5 hops: at each hop it takes the wallet's biggest counterparties by dollar volume, outward (where the money went), inward (where it came from) or both. Every wallet on the way comes with its label, so you see where the trail reaches an exchange.
Are NFT and internal transfers listed?
No. NFT transfers and coin moved by a contract call (internal transfers) are not listed. token_transfers holds every ERC-20 Transfer event of the transaction, in log order. The coin sent at the top level is in value.
What do the dollar values mean?
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.
Can I track transactions live?
Yes: subscribe to chain.transfers on wss://stream.vike.io/v1/stream/onchain with a wallet filter; it matches the wallet on either side. Every filter of the channel and real events are on the Whale alerts page.