Poolscope, Pool earnings and flow analytics
Know what every pool of your pair earned, hour by hour, and who traded through it.
Every tracked pool of a token pair with its fee model, TVL and liquidity near the price. Exact hourly fees and volumes for any pool. Each pool's flow split into aggregator, bot, organic and unclassified traffic.
- ALMs and vault managers
- DEX teams
- Market makers
Which pools carry the flow, at each size
Live data· block 53,134,715How the production router splits a WETH trade across venues right now, from $1K to $10M. Small trades take the cheapest pool; large ones spread across every pool with depth. Poolscope tells you what each of those pools earned from it.
- Aerodrome Slipstream
Live from the public Truefill stream: the first hop's split of each route, by venue. Hover a segment for its pool count. Poolscope's keyed API adds every tracked pool of the pair with TVL, liquidity near the price and exact hourly fees.
Who trades through the pool, hour by hour
Sample response · illustrative numbersA pool's USD volume per hour split into aggregator, bot, organic and unclassified flow. No wallet addresses, only the mix. Watch the bot share jump late in the day: that is what a Tripwire traffic-jump alert catches.
Share of the day's volume
- Aggregators47.7% · $42.8M
- Bots (MEV and others)42.1% · $37.8M
- Organic7.8% · $7.03M
- Unclassified2.3% · $2.07M
Sample day in the shape of GET /ext/traffic/series (one Uniswap v3 WETH/USDC pool on Base); a key returns the real hours.
Every pool of the pair, side by side
Sample response · illustrative numbersOne call lists every tracked pool of a pair across DEXes: fee model, TVL, how much liquidity sits close to the price, and exact 7-day swaps and fees.
| Pool | Fee | TVL | USDC within ±0.1% | ±0.5% | ±1% | Swaps, 7 days |
|---|---|---|---|---|---|---|
Uniswap v3 0xd0b5…f224 | 5 bp static | $12.2M | $415K | $1.60M | $2.36M | 61,840 |
Aerodrome Slipstream 0xb2cc…dc59 | 4.5 bp dynamic | $30.9M | $1.60M | $5.25M | $7.82M | 214,411 |
Aerodrome v2 0xcdac…5c43 | 30 bp static | $4.21M | $1.05K | $5.25K | $10.5K | 3,922 |
Example response of GET /ext/market/pair-pools for WETH/USDC on Base.
Do the fees cover the arbitrage loss?
Sample response · illustrative numbersEach pool's swap fees per unit of active liquidity over the loss its LPs give up to arbitrage (LVR, on the pair's reference price), over 72 hours. Gross counts every swap fee; LP-net keeps the DEX's documented LP share. Sort any column.
| Fees by flow | Flags | ||||||||
|---|---|---|---|---|---|---|---|---|---|
uniswap-v3 0x6c56…1372 | 30 bp | 0.98 | 0.81 | Fees do not cover the benchmark arbitrage loss | 83.3%covers at gross ≥ 1.20 | 100% of F split | $769.3K | $787.5K | derived-l |
solidly-v3 0x551a…221b | 5 bp | 0.56 | 0.45 | Fees do not cover the benchmark arbitrage loss | 80.0%covers at gross ≥ 1.25 | 100% of F split | $4.29 | $7.67 | derived-l |
- Good> 100
- Fine10–100
- Watch2–10
- Thin1–2
- Not covered< 1
- Routed
- Direct
- Unclassified
- Arbitrage
Token view: every pair of WETH
| WETH/USDC | 2 | $769.3K | $787.6K | $3.46B | 0.98 | 0.81 |
- Gross F/LVR
- All swap fees over the benchmark loss to arbitrage (LVR) on the pair's reference price.
- LP-net F/LVR
- Gross × the DEX's documented LP share. At 1 or more, LP fees cover the benchmark loss.
- Expected position return
- Needs a range and capital: Headroom's capital curve.
- Realised position return
- One position's actual P&L: not modelled.
Sample in the shape of GET /ext/market/fee-lvr (WETH/USDC on Base, 3 days to 2026-10-22 19:00 UTC; the flow split is illustrative). The token figure is a ratio of dollar sums, not an average of pool ratios. LVR is a benchmark (Milionis et al.): what a rebalancing portfolio would have kept, not a realised P&L.
What Poolscope gives you
Every competing pool, side by side
One call lists every tracked pool of a pair across DEXes, with its fee model, TVL and how much liquidity sits within 0.1 %, 0.5 % and 1 % of the price.
Fees you can reconcile
Fees are computed swap by swap the way each pool contract computes them, including concentrated pools, which are replayed on their exact state. Each row names its fee model. A fee we cannot compute exactly is left empty with the reason, never estimated.
Know who your flow is
See how much of a pool's volume comes from aggregators, bots and organic traders, hour by hour, in raw token amounts and USD. No wallet addresses are exposed.
Fees against the arbitrage benchmark
F/LVR compares what a pool's liquidity earned in fees with what it gave up to arbitrage on the pair's reference price, for any pool, pair or token. Each pool shows the gross ratio, the ratio net of its documented LP share, and its fees split into routed, direct and arbitrage flow.
Fetch only what is new
Hourly reads take a cursor, so a client keeps its own copy and asks only for newer hours. Every answer says how far the data has been computed.
How it works
- 01
Every swap, decoded
Every swap of every tracked pool comes from the indexed on-chain events, in block and log order.
- 02
Fees replayed per swap
Each swap's fee is computed as the contract does it, on the state it actually met, and summed per pool and hour.
- 03
Served by the hour
Hourly rows for 14 days, plus a live view of every pool of a pair computed at the latest block.
Call it from code
Every tracked pool of a token pair at the latest block: DEX, family, fee model, reserves, TVL, liquidity within ±0.1 %, ±0.5 % and ±1 % of mid, and exact 7-day fees.
GET /api/v1/ext/market/pair-pools · 50 CU + 1 CU per pool
Send your key in x-api-key and a compute budget in x-compute-budget-ms (1 to 5000 ms; the example uses 2000).
inRange amounts are what the pool holds between its mid price and each band edge, computed with the pool's own price math.
Example values are illustrative. Token addresses are real Base contracts; amounts are raw integer units as decimal strings.
curl -s "https://llens.abanchev.com/api/v1/ext/market/pair-pools?chainId=8453&tokenA=0x4200000000000000000000000000000000000006&tokenB=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" \
-H "x-api-key: $LL_API_KEY" \
-H "x-compute-budget-ms: 2000"{
"chainId": "8453",
"sequence": "1843207",
"blockNumber": "52914031",
"blockHash": "0x7c1e5f0b9a2d43e8c6f1a0b7d9e2c4f6a8b0d1e3f5a7c9b2d4e6f8a0c2e4b6d8",
"stateDigest": "4b9e0c7f2a1d3e5b8c6a9f0d2e4b7c1a3f5e8d0b2c4a6e9f1d3b5c7a0e2f4d6b",
"blockTimestamp": "1792419821",
"stateAgeMs": 412,
"canonicalStable": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"tokenA": "0x4200000000000000000000000000000000000006",
"tokenB": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"pools": [
{
"pool": "0xd0b53d9277642d899df5c87a3966a349a798f224",
"dex": "Uniswap v3",
"family": "univ3",
"token0": "0x4200000000000000000000000000000000000006",
"token1": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals0": 18,
"decimals1": 6,
"feeModel": {
"kind": "static",
"feeZeroToOneBps": "5",
"feeOneToZeroBps": "5",
"reason": null
},
"reserves": {
"amount0": "2412881934772001827733",
"amount1": "5904127733812"
},
"inRange": [
{
"bandBps": 10,
"amount0": "158204411902884511744",
"amount1": "414992881403"
},
{
"bandBps": 50,
"amount0": "611930277018322041856",
"amount1": "1602208114570"
},
{
"bandBps": 100,
"amount0": "902417730551930634240",
"amount1": "2361830902216"
}
],
"unavailable": null,
"tvlUsd": "12222004.28",
"tvlUnavailable": null,
"fees7d": {
"fees0": "41205118930214471680",
"fees1": "107912440912",
"swaps": 61840,
"computedHours": 168,
"from": "2026-10-12T14:00:00.000Z"
}
},
{
"pool": "0xb2cc224c1c9fee385f8ad6a55b4d94e92359dc59",
"dex": "Aerodrome Slipstream",
"family": "slipstream",
"token0": "0x4200000000000000000000000000000000000006",
"token1": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals0": 18,
"decimals1": 6,
"feeModel": {
"kind": "dynamic",
"feeZeroToOneBps": "4.5",
"feeOneToZeroBps": "4.5",
"reason": "current-fee-of-a-dynamic-fee-pool"
},
"reserves": {
"amount0": "6120774410200019312640",
"amount1": "14833190277418"
},
"inRange": [
{
"bandBps": 10,
"amount0": "611207741020001931264",
"amount1": "1600443290112"
},
{
"bandBps": 50,
"amount0": "2004113908210771443712",
"amount1": "5247730118804"
},
{
"bandBps": 100,
"amount0": "2988201554871200563200",
"amount1": "7824409118230"
}
],
"unavailable": null,
"tvlUsd": "30860195.66",
"tvlUnavailable": null,
"fees7d": {
"fees0": "118440271934017310720",
"fees1": "310115288140",
"swaps": 214411,
"computedHours": 168,
"from": "2026-10-12T14:00:00.000Z"
}
},
{
"pool": "0xcdac0d6c6c59727a65f871236188350531885c43",
"dex": "Aerodrome v2",
"family": "solidly-v2",
"token0": "0x4200000000000000000000000000000000000006",
"token1": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals0": 18,
"decimals1": 6,
"feeModel": {
"kind": "static",
"feeZeroToOneBps": "30",
"feeOneToZeroBps": "30",
"reason": null
},
"reserves": {
"amount0": "803311902117480263680",
"amount1": "2103418877410"
},
"inRange": [
{
"bandBps": 10,
"amount0": "401455890211304448",
"amount1": "1051446918"
},
{
"bandBps": 50,
"amount0": "2003788201117392896",
"amount1": "5251972011"
},
{
"bandBps": 100,
"amount0": "3994613190027460608",
"amount1": "10490762018"
}
],
"unavailable": null,
"tvlUsd": "4206808.20",
"tvlUnavailable": null,
"fees7d": {
"fees0": "2914002711840092160",
"fees1": "7630127440",
"swaps": 3922,
"computedHours": 168,
"from": "2026-10-12T14:00:00.000Z"
}
}
]
}Endpoints
Every call returns JSON with the block it was computed on.
- GET/ext/market/pair-poolsEvery pool of a pair · 50 CU + 1 CU per pool
- GET/ext/market/pool-hoursHourly pool facts · 50 CU
- POST/ext/market/registrationsRegister a pool for samples · 0 CU (up to 50 pools per organization)
- GET/ext/traffic/seriesTraffic mix of a pool · 50 CU
- GET/ext/traffic/poolsPools by volume, with traffic mix · 50 CU
- GET/ext/market/pair-discoveryPairs by aggregator demand · 50 CU
- GET/ext/market/fee-lvrFees vs arbitrage loss (F/LVR) · 50 CU + 1 CU per pool
Plans
- Builder
- Pro
- Enterprise
Per-pool reads are included with a key. Chain-wide rankings are available by arrangement.
Pricing on request.
Good to know
- Hourly rows cover the last 14 days and exist for hours with swaps.
- TVL and in-range history are sampled for registered pools only (up to 50 per organization), from registration on.
- Fees are gross: protocol, community and gauge shares are not split out, and a v4 hook's own take is excluded.
- F/LVR covers concentrated, constant-product and stable pools; LP-net figures exist only where the DEX documents its LP share.
- Live on Base and Sonic.
Other Liquidity Lens products
- Liquidity LensTruefill, Execution-price oracleThe price you can actually execute, at your size, with the route that proves it.
- Liquidity LensHeadroom, LP opportunity discoveryFind the pairs where new liquidity would earn more in fees than it gives up to arbitrage.
- Liquidity LensRangefinder, LP range and capital backtestsTest a range or a capital size against the swaps that actually hit the pool, before you deploy.
- Liquidity LensTripwire, Execution and flow alertsHear about a widening execution gap or a shift in a pool's flow, without polling.