API

POST /trace

Follow one transfer through a mixer or an exchange, and get the wallets on the other side that most likely belong to the same person.

Request

Describe the transfer to follow. Its values come from the connections[].transfers of an /analyze response.

FieldTypeMeaning
walletstringRequired. The wallet whose transfer is traced.
counterpartystringRequired. The mixer pool or exchange wallet on the other side.
signaturestringRequired. The transfer's transaction.
direction"in" | "out"Required. out: the wallet deposited (traced forward). in: it withdrew (traced back).
timeintegerRequired. Unix seconds.
solnumberRequired. SOL moved (0 if none).
usdnumberRequired. Stablecoins moved, in dollars (0 if none).
windowintegerSeconds to search. Default 24 h for a mixer, 1 h for an exchange; at most 7 days.
request.sh
1curl -X POST https://iriscan.app/api/trace \2  -H "Authorization: Bearer $IRIS_KEY" \3  -H "Content-Type: application/json" \4  -d '{5    "wallet": "21DnhyxUW2vJghLXXnXwEkmyHrV9vkAmGXvGqoTytzqF",6    "counterparty": "4AV2Qzp3N4c9RfzyEbNZs2wqWfW4EwKnnxFAZCndvfGh",7    "signature": "<deposit signature>",8    "direction": "out",9    "time": <unix seconds>,10    "sol": 254.0226,11    "usd": 012  }'

Response

200 OK · response.json (abridged)
1{2  "entity": "Privacy Cash",3  "kind": "mixer",4  "direction": "forward",5  "anchor": { "signature": "…", "amount": 254.0226, "asset": "SOL", "time": … },6  "window": { "from": …, "to": …, "searched": ["4AV2…"], "transactions": 1840, "complete": true },7  "anonymity_set": 1,8  "candidates": [9    {10      "address": "EeTpxJBVuT6mUDFekexBbza79Ss2arkQ3C4tYgYcHxBF",11      "signature": "…",12      "amount": 253.1275,13      "time": …,14      "delta_seconds": …,15      "tier": "trivial",16      "confidence": 1,17      "via": null,18      "label": null,19      "same_wallet": false20    }21  ]22}
FieldTypeMeaning
entity, kindstringWho is in the middle, and whether it is a mixer or an exchange.
direction"forward" | "backward"Forward from a deposit, back from a withdrawal.
anchorobjectThe transfer traced.
windowobjectWhat was searched. complete: false means a busy wallet was read in part.
anonymity_setnumberHow many transfers of the same amount were found. 1 means only one fits.
candidates[]CandidateBest first: address, amount, delta_seconds, tier, confidence (0 to 1), via (an exchange deposit address it went through), same_wallet.

Tiers go from trivial (within 5 minutes) through strong, likely, weak and loose to distant (more than a day). See Reading the results.

Specific errors

  • 400 “Not a mixer or an exchange Iris knows”: the counterparty can't be traced through.
  • 400 “The transfer moved no SOL or stablecoin to trace”.
  • 400 “direction must be "in" or "out"”.