POST/api/analyze

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"])
response.json· example
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

  • addressstringrequired

    A base58 Solana address.

  • depthintegeroptional

    Recent transactions to read, 1 to 10,000. Defaults to 1,000; more is slower.

ReturnsWalletProfile

request.sh
1curl -X POST http://localhost:3000/api/analyze \2  -H "Authorization: Bearer $IRIS_KEY" \3  -H "Content-Type: application/json" \4  -d '{ "address": "sy88tvipKfaCTuVVeU2PczPa88hqgPfKnYQyCHboHP8" }'
200 OK · response.json
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.

wallet-profile.ts
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};
400

Bad request

Not a valid Solana address, depth out of range, malformed body. Fix the request; retrying won't help.

401

No valid key

The key is missing, wrong or revoked. Create one in Account → API.

402

Out of credits

Nothing left on your plan or in packs. Top up, then retry.

429

Too many at once

Three requests run at once per account. Retry when one finishes.

500

Server error

Something failed on our side or upstream. Safe to retry, and not charged.

503 · 504

Busy or too slow

At capacity, or the work took over two minutes. Retry after a few seconds.

Build on Iris.

See it answer first, or check that it is up.