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.

FieldTypeMeaning
addressstringRequired. The wallet to start from.
chainstringAs for /analyze: solana for a base58 address, ethereum for a 0x one, unless given.
assetstringnative (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.
sinceintegerUnix seconds: follow what left the start wallet after this time.
max_hopsintegerHops 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}
FieldTypeMeaning
assetobjectWhat was followed: symbol, address (null for the native coin), decimals.
hops[]HopIn 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.reasonstringexchange, 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.detailstringWhy the trail ends, in a sentence ready to show.
end.holdingnumber | nullFor at_rest: what the last wallet still holds of the asset.
end.branches[]BranchFor split: the largest transfers it split into (to, amount, usd, signature, to_label).
end.output, signature, timeobject, string, numberFor 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.