Wallets API
GET/wallets
Several wallets' portfolios with totals, on every listed chain each address fits (wallets=); or wallet discovery: the top wallets by PnL, volume or win rate, by label.
Parameters
| Name | In | Type | Default | Allowed values |
|---|---|---|---|---|
wallets | query | string | none | 1–10 items, comma-separated: <chain>:<address>, or a bare address (every listed chain its format fits) |
chains | query | string | every listed chain | Comma-separated: evm:56 (BSC), solana, evm:8453 (Base), evm:4663 (Robinhood Chain) or evm:1 (Ethereum) |
limit | query | integer | 100 (wallets), 50 (discovery) | Holdings per portfolio 1–500; wallets per page 1–100 |
label | query | string | any wallet | Discovery: creator, insider, sniper, smart_money, bot (not fresh: see labels) |
sort | query | string | pnl30d | Discovery: pnl7d, pnl30d, volume30d, winRate30d |
cursor | query | string | first page | Discovery: the previous page's next |
Response
| Field | Type | Meaning |
|---|---|---|
wallets, chains | string[] | wallets=: the wallets and chains answered. |
totalValueUsd, pnl | number, object | wallets=: sums of the portfolios' totalValueUsd and pnl. |
complete | boolean | wallets=: false when a portfolio could not be read: the totals leave it out. |
portfolios[] | array | wallets=: one per wallet and chain, in request order: the wallet portfolio answer, or { chain, wallet, status, error } for one that could not be read (the status its own route would answer). |
chains, label, sort, rankedAt | string[], string | null, string, number | null | Discovery: the request, and when the ranking was built, unix ms. |
wallets[] | array | Discovery: highest first. Each: chain, wallet, labels, pnl7dUsd, pnl30dUsd, volume30dUsd, winRate30d (null without results), wins30d, losses30d, swaps7d. |
next | string | null | Discovery: cursor for the next page. |
Example
Captured 2026-09-28 18:03 UTC on a test instance, trimmed to 1 holding each.
curl -s -H 'Authorization: Bearer <key>' 'https://app.aurelia.build/api/wallets?wallets=evm:56:0x3304e22ddaa22bcdc5fca2269b418046ae7b566a,solana:Fm1Nzv3EcgGMW2MFHHGKjdVDbvHsMMtoRdoBDmUmsFFE&limit=1'
{
"wallets": [
"0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
"Fm1Nzv3EcgGMW2MFHHGKjdVDbvHsMMtoRdoBDmUmsFFE"
],
"chains": [
"evm:56",
"solana"
],
"totalValueUsd": 214764,
"pnl": {
"realizedUsd": 66.2589770354906,
"unrealizedUsd": 57.375000000000064,
"totalUsd": 123.63397703549066
},
"complete": true,
"portfolios": [
{
"chain": "evm:56",
"wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
"indexedSince": 1790546261920,
"labels": [
"sniper",
"fresh"
],
"fundedBy": {
"address": "0x8894e0a0c962cb723c1976a4421c95949be2d4e3",
"amount": "0.25",
"time": 1790616461920,
"tx": "0x124aa51a8b73a7c373249b80ec4beb9fa4e80b4aa78a8bc73a64c781b3f2925d",
"labels": []
},
"fundedByReason": null,
"block": 1000748,
"balancesAt": 1790618266812,
"totalValueUsd": 214134,
"pnl": {
"realizedUsd": 59.5089770354906,
"unrealizedUsd": 6.776263578034403e-14,
"totalUsd": 59.50897703549067
},
"holdings": [
{
"kind": "token",
"token": {
"address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
"symbol": "TAX",
"name": "Tax Token",
"decimals": 18
},
"balance": "21500000",
"priceUsd": 0.006,
"valueUsd": 129000,
"allocation": 0.6024265179747261,
"thin": false,
"position": {
"quote": false,
"trades": 22,
"buys": 12,
"sells": 10,
"unpricedTrades": 0,
"bought": "20118000",
"sold": "9800",
"open": "20108200",
"boughtUsd": 1008,
"soldUsd": 60,
"avgBuyPriceUsd": 0.00005010438413361169,
"avgSellPriceUsd": 0.006122448979591836,
"priceUsd": 0.006,
"priceAt": 1790618400000,
"realizedPnlUsd": 59.5089770354906,
"unrealizedPnlUsd": null,
"totalPnlUsd": 59.5089770354906,
"firstTradeAt": 1790546864920,
"lastTradeAt": 1790618578665
}
}
],
"unpriced": 0,
"count": 6,
"liquidity": {
"protocols": [
"pancakeswap-v2",
"pancakeswap-v3",
"uniswap-v2",
"uniswap-v3"
],
"incomplete": [],
"notCovered": [
{
"protocol": "pancakeswap-infinity-cl",
"reason": "its positions are not enumerable per owner"
}
],
"error": null
}
},
{
"chain": "solana",
"wallet": "Fm1Nzv3EcgGMW2MFHHGKjdVDbvHsMMtoRdoBDmUmsFFE",
"indexedSince": 1790546261920,
"labels": [
"insider"
],
"fundedBy": null,
"fundedByReason": "the chain could not be read (Unable to connect. Is the computer able to access the url?)",
"block": 449600022,
"balancesAt": 1790618266815,
"totalValueUsd": 630,
"pnl": {
"realizedUsd": 6.75,
"unrealizedUsd": 57.37499999999999,
"totalUsd": 64.125
},
"holdings": [
{
"kind": "token",
"token": {
"address": "native",
"symbol": "SOL",
"name": "Solana",
"decimals": 9
},
"balance": "3.4",
"priceUsd": 150,
"valueUsd": 510,
"allocation": 0.8095238095238095,
"thin": false,
"position": null
}
],
"unpriced": 0,
"count": 3,
"liquidity": {
"protocols": [
"raydium-cpmm",
"orca-whirlpool"
],
"incomplete": [],
"notCovered": [],
"error": null
}
}
]
}
Notes
wallets=: each portfolio reads its wallet's balances from the chain, as the wallet portfolio does, and shares that route's caches. A bare0xaddress is read on BSC, a base58 one on Solana.400for more than 10, one that fits no chain ofchains, orlabel,sortorcursoralongside.- Discovery reads a ranking rebuilt every 15 minutes with the labels (the top 1,000 per chain, label and sort), never a scan per request: the wallets that traded at least $1,000 in 30 days, or carry a label. Figures are the analysis's over 7 and 30 days, quote tokens left out;
winRate30dranks only wallets with 10+ results. Cached a minute.