Wallet intelligence,
one request away.
The engine behind every Iris report, as a JSON API. Send a Solana address; get back its identity, its risk, and the evidence for both.
1# Analyze a wallet: its identity, risk and the proof2import os3import requests4 5profile = requests.post(6 "http://localhost:3000/api/analyze",7 headers={"Authorization": f"Bearer {os.environ['IRIS_KEY']}"},8 json={9 "address": "sy88tvipKfaCTuVVeU2PczPa88hqgPfKnYQyCHboHP8",10 "depth": 200,11 },12).json()13 14print(profile["identity"], profile["risk"])1{2 "address": "sy88tvipKfaCTuVVeU2PczPa88hqgPfKnYQyCHboHP8",3 "identity": {4 "type": "MEV_ARBITRAGE",5 "confidence": 0.956 },7 "risk": {8 "level": "LOW",9 "score": 10,10 "confidence": 0.311 },12 "summary": [13 "MEV arbitrage bot",14 "Bot",15 "Tips Jito",16 "Swaps on Jupiter, BisonFi"17 ],18 "behaviors": [19 {20 "kind": "MEV_ARBITRAGE",21 "confidence": 0.9522 },23 {24 "kind": "BOT",25 "confidence": 0.926 },27 {28 "kind": "JITO_TIPPER",29 "confidence": 0.930 }31 ],32 "behavior": {33 "transactions_analyzed": 200,34 "active": true35 },36 "meta": {37 "scope": "live",38 "depth": 20039 }40}One key, no SDK
Plain JSON over HTTP with an API key from your account. Send an address, get a profile back. Nothing to install.
Explainable by design
Every label carries its source, every behavior the transactions that show it.
The same engine
The reports and the Explorer are built on these exact endpoints, nothing held back.
Endpoints
Three routes.
Everything Iris knows.
JSON in, JSON out, under /api on this site. Errors come back as {“error”: “…”} with a status that tells you whether to retry.
POST/api/analyze
Analyze a wallet
Reads the wallet's latest transactions, checks every counterparty against 100,000+ labels, runs the behavior rules and returns who it is, how risky it is and why.
Body
addressstringrequiredA base58 Solana address.
depthintegeroptionalRecent transactions to read, 1 to 10,000. Defaults to 1,000; more is slower.
ReturnsWalletProfile
1curl -X POST http://localhost:3000/api/analyze \2 -H "Authorization: Bearer $IRIS_KEY" \3 -H "Content-Type: application/json" \4 -d '{ "address": "sy88tvipKfaCTuVVeU2PczPa88hqgPfKnYQyCHboHP8" }'1{2 "identity": {3 "type": "MEV_ARBITRAGE",4 "confidence": 0.955 },6 "risk": {7 "level": "LOW",8 "score": 10,9 "confidence": 0.310 },11 "summary": [12 "MEV arbitrage bot",13 "Bot",14 "Tips Jito"15 ],16 "behaviors": [17 {18 "kind": "MEV_ARBITRAGE",19 "confidence": 0.9520 }21 ],22 "meta": {23 "scope": "live",24 "depth": 100025 }26}The profile
A verdict,
and the proof behind it.
What /analyze returns, as its type. Every field is what the report pages render, so anything you see in Iris, you can build on.
1type WalletProfile = {2 address: string;3 // What the wallet is, and how sure: "MEV_ARBITRAGE", "EXCHANGE", "MIXER"…4 identity: { type: string; confidence: number };5 // A 0–100 score, LOW / MEDIUM / HIGH, and how complete the data behind it is6 risk: { level: "LOW" | "MEDIUM" | "HIGH"; score: number; confidence: number };7 // One-line takeaways: "MEV arbitrage bot", "Sends to Binance"8 summary: string[];9 // Everything known about the address, each with its source and a link10 labels: Label[];11 // Patterns found, with the transaction signatures that show them12 behaviors: Behavior[];13 // Mixers, drainers and sanctioned wallets it dealt with14 flagged_counterparties: Counterparty[];15 // Exchanges, protocols and DEXes it used16 known_counterparties: Counterparty[];17 // SOL and dollars in and out, and the biggest parties on each side18 flows: { inbound: FlowSide; outbound: FlowSide };19 // Every counterparty with totals and transfers: the Explorer's graph20 connections: Connection[];21 // Where it swapped, and what it traded there22 swap_venues: SwapVenue[];23 // SOL held since the wallet was created24 balance_history: { time: number; sol: number; sampled: boolean }[];25 // When it ran, how many transactions it read, how complete the data is26 meta: { analyzed_at: string; depth: number; data_completeness: number };27};Bad request
Not a valid Solana address, depth out of range, malformed body. Fix the request; retrying won't help.
No valid key
The key is missing, wrong or revoked. Create one in Account → API.
Out of credits
Nothing left on your plan or in packs. Top up, then retry.
Too many at once
Three requests run at once per account. Retry when one finishes.
Server error
Something failed on our side or upstream. Safe to retry, and not charged.
Busy or too slow
At capacity, or the work took over two minutes. Retry after a few seconds.