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
# 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.
{
"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.
# 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.
# 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.
# 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.
Were 0x556e9d5d9e64638edde632bbd4810c9fd0d88397 and 0xdfd5293d8e347dfe59e90efd55b2956a1343963d funded by the same address?