API
POST /follow
Follow the funds out of a wallet: the main stream of money, hop by hop, until it reaches an exchange, a bridge, a mixer or a swap, splits, or comes to rest.
Request
Costs 2 analyses from your plan, or 2 credits ($0.10), and takes up to about 90 seconds. At each wallet, Iris reads the transfers of the followed asset that left after the money arrived, and takes the one that carried most of it. Works on Solana and on the EVM chains. See Follow the funds for how a trail is read.
| Field | Type | Meaning |
|---|---|---|
address | string | Required. The wallet to start from. |
chain | string | As for /analyze: solana for a base58 address, ethereum for a 0x one, unless given. |
asset | string | native (SOL or ETH, wrapped included), or a token mint or contract. Left out: whatever value left the wallet first, the native coin and stablecoins by dollar value first. |
since | integer | Unix seconds: follow what left the start wallet after this time. |
max_hops | integer | Hops to follow at most, 1 to 50. Default 25. |
request.sh
1curl -X POST https://iriscan.app/api/follow \2 -H "Authorization: Bearer $IRIS_KEY" \3 -H "Content-Type: application/json" \4 -d '{ "address": "<wallet>", "asset": "native" }'Response
200 OK · response.json (abridged)
1{2 "chain": "solana",3 "start": "<wallet>",4 "asset": { "symbol": "SOL", "address": null, "decimals": 9 },5 "hops": [6 {7 "from": "<wallet>",8 "to": "<next wallet>",9 "amount": 412.5,10 "usd": 61875,11 "symbol": "SOL",12 "signature": "…",13 "time": …,14 "share": 0.98,15 "to_label": null16 }17 ],18 "end": {19 "reason": "exchange",20 "address": "<last wallet>",21 "detail": "…",22 "holding": null,23 "branches": [],24 "output": null,25 "signature": null,26 "time": null27 }28}| Field | Type | Meaning |
|---|---|---|
asset | object | What was followed: symbol, address (null for the native coin), decimals. |
hops[] | Hop | In order: from, to, amount, usd when known, the largest transaction that carried it (signature, time), its share of what had arrived in the sending wallet, and to_label: name and kind (exchange, bridge, mixer, dex, contract, sanctioned, hack or other) when the destination is known. |
end.reason | string | exchange, bridge, mixer, dex_swap, split, at_rest, loop (back to a wallet already on the trail), max_hops or no_data (the next wallet couldn't be read). |
end.detail | string | Why the trail ends, in a sentence ready to show. |
end.holding | number | null | For at_rest: what the last wallet still holds of the asset. |
end.branches[] | Branch | For split: the largest transfers it split into (to, amount, usd, signature, to_label). |
end.output, signature, time | object, string, number | For dex_swap: the asset it was swapped into, the largest swap and when the first one was. Follow output.address from end.address with that since to keep going. |
A lead, not a proof
The largest transfer is usually the money being followed, but not always. A trail cut short by the time budget is still charged; one that fails on its first wallet is refunded.