vike

Recipe 4 of 32

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.

GET /v1/onchain/wallets/{address}/first-funder returns the earliest inbound coin transfer (first_native_in) and the earliest priced token transfer (first_token_in) of a wallet, each with the sender and its label. Call it for both wallets: the same from on both is a shared first funder. For funders more than one hop up, trace each wallet with direction=in and compare the addresses the two graphs reach. The parameters are on Wallet first funder, Trace a wallet's funds and Compare wallets.

Quick answer

cURL
# who sent the first ETH to wallet A, with the sender's label
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/first-funder" \
  | jq '.first_native_in | {from, label, wallet_type, time, amount, amount_symbol}'

Example response

Captured from the live API on 2026-10-24 at 17:16 UTC, the first_native_in object of the response.

The same call for wallet B, 0xdfd5293d8e347dfe59e90efd55b2956a1343963d, returned the same sender: 0x28c6…1d60 sent it 50,000 ETH on 2021-05-24. So the two wallets share a first funder. That sender is a Binance hot wallet (wallet_type: "cex"), and B is another Binance wallet, so the match says nothing about who controls A.

Example response
{
  "from": "0x28c6c06298d514db089934071355e5743bf21d60",
  "label": "binance",
  "wallet_type": "cex",
  "time": "2023-12-22T02:55:35Z",
  "amount": 100.0468,
  "amount_symbol": "ETH"
}

Variations

The second wallet. Run the same call for B and compare the two from values.

cURL — wallet B
# who sent the first ETH to wallet B
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0xdfd5293d8e347dfe59e90efd55b2956a1343963d/first-funder" \
  | jq '.first_native_in | {from, label, wallet_type, time, amount, amount_symbol}'

Funders further up. List every address two hops upstream of a wallet, then do the same for the other wallet. An address in both lists that is not an exchange is a candidate shared funder. min_usd lowers the default floor of 10,000 USD per transfer.

cURL — two hops in
# the addresses that sent money to wallet A, and who funded them, over 90 days
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/0x556e9d5d9e64638edde632bbd4810c9fd0d88397/trace?direction=in&depth=2&width=5&window=90d&min_usd=1000" \
  | jq -r '.nodes[] | "\(.address) \(.depth) \(.label)"'

Shared counterparties. /wallets/compare lists the addresses both wallets dealt with in either direction, a wider net than funding alone.

cURL — compare
# counterparties and tokens the two wallets share over 180 days
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/wallets/compare?address_a=0x556e9d5d9e64638edde632bbd4810c9fd0d88397&address_b=0xdfd5293d8e347dfe59e90efd55b2956a1343963d&window=180d&limit=20"

Before you rely on it

A shared exchange is not a shared owner

Exchange hot wallets fund millions of wallets, so two wallets withdrawn from the same exchange share a funder by default. Treat a match as a lead only when the shared sender is unlabelled or a user wallet. The first funder is the earliest inbound we hold, not proof: native rows hold top-level sends only, coin sent through a contract or a bridge is missing, and inbound below 0.0001 coin or 1 USD is skipped unless you pass min_native=0 or min_usd=0.

Ask your agent

Connected to the Vike MCP server (https://vike.io/mcp) in Claude, ChatGPT or Cursor, ask it in plain words. The wallet_first_funder tool answers it, at 2 credits a call.

Ask your agent
Were 0x556e9d5d9e64638edde632bbd4810c9fd0d88397 and 0xdfd5293d8e347dfe59e90efd55b2956a1343963d funded by the same address?
Example response
{  "from": "0x28c6c06298d514db089934071355e5743bf21d60",  "label": "binance",  "wallet_type": "cex",  "time": "2023-12-22T02:55:35Z",  "amount": 100.0468,  "amount_symbol": "ETH"}