Headroom, LP opportunity discovery
API docs
Part of Poolscope. Ranks the pairs where added liquidity would net the most after the arbitrage benchmark, then sizes the capital per range preset on the production router: routed, direct and arbitrage fees kept apart, with the minimum-viable, most capital-efficient and highest-net capital.
Base URL https://llens.abanchev.com/api/v1. Authentication, deadlines, metering and errors are on Getting started. See the Headroom live demo.
Example values are illustrative. Token addresses are real Base contracts; amounts are raw integer units as decimal strings.
/api/v1/ext/market/lp-opportunitiesRanked LP opportunities
Pairs ranked by the projected incremental net LP income per day of a full-range capital scenario, with the routed, direct and arbitrage volume, each fee component, the competitors' F/LVR, the target pool and confidence. Pairs below a minimum of daily fees are left out.
- Cost
- 100 CU
- Headers
- Send your key in x-api-key.
| Query | Required | Description |
|---|---|---|
| chainId | yes | 8453 (Base) or 146 (Sonic). |
| token | no | Only pairs containing this token. |
| dex | no | Target DEX: its pool on the pair, else a new pool on it. |
| feeBps | no | One standard fee tier of that DEX (needs dex). |
| capitalUsd | no | Scenario capital in USD (100,000 by default). |
| lpShare | no | LP share override (0–1]; else the documented share. |
| horizonDays | no | 1 to 90 days (30 by default). |
| windowHours | no | History window, 24 to 336 hours (168 by default). |
| offset | no | Paging offset. |
| limit | no | At most 20. |
The ranking does not route: the target keeps its own routed and direct fees, diluted by the added liquidity. Use the capital curve for the router.
curl -s "https://llens.abanchev.com/api/v1/ext/market/lp-opportunities?chainId=8453&capitalUsd=100000&horizonDays=30&windowHours=72" \
-H "x-api-key: $LL_API_KEY"{
"chainId": "8453",
"from": "2026-10-15T19:00:00.000Z",
"to": "2026-10-22T19:00:00.000Z",
"windowHours": 168,
"total": 3,
"belowFeeFloor": 14,
"minPairFeesUsdPerDay": 50,
"offset": 0,
"nextOffset": null,
"pairs": [
{
"tokenA": "0x4200000000000000000000000000000000000006",
"tokenB": "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf",
"symbolA": "WETH",
"symbolB": "cbBTC",
"routedVolumeUsd": 22400000,
"directVolumeUsd": 4100000,
"arbVolumeUsd": 12700000,
"unclassifiedVolumeUsd": 1200000,
"pairFeesUsdPerDay": 102578,
"pools": 2,
"pricedPools": 2,
"bestCompetitor": {
"pool": "0x8c7080564b5a792a33ef2fd473fba6364d5495e5",
"dex": "solidly-v3",
"ratio": 0.559632,
"feeBps": 5,
"volumeUsd": 7742.51
},
"medianCompetitorRatio": 0.559632,
"target": {
"kind": "pool",
"pool": "0x70acdf2ad0bf2402c957154f944c19ef4e1cbae1",
"dex": "uniswap-v3",
"ratio": 1.56403,
"band": "uncovered",
"lpNetRatio": 1.30284,
"coverage": "does-not-cover",
"depthUsd": 1385500000,
"feeTierBps": 30
},
"assumedFeeBps": 30,
"screening": {
"capitalUsd": 100000,
"rangePreset": "full",
"lpShare": {
"share": 0.833,
"source": "Uniswap protocol-fee expansion (Base, 2026): 1/4 of the 0.01%/0.05% tiers, 1/6 of 0.3%/1%",
"given": false
},
"feesUsdPerDay": {
"routed": 4.77646,
"direct": 2.09698,
"unclassified": 0.582495,
"arb": 4.19427
},
"lvrUsdPerDay": 7.44918,
"ratioGross": 1.56396,
"ratioLpNet": 1.30278,
"netUsdPerDay": 2.25544,
"netUsdPerDayPer1k": 0.0225544,
"horizonDays": 30,
"netUsdHorizon": 67.6633,
"coverage": "covers",
"arbRate": {
"perUnitLPerHour": 0.000170473,
"tierBps": 30,
"match": "same-tier",
"pools": 1
}
},
"pairDepthUsd": 1385510000,
"confidence": "medium",
"flags": [
"few-competitors"
]
},
{
"tokenA": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"tokenB": "0x940181a94a35a4569e4529a3cdfb74e38fd98631",
"symbolA": "USDC",
"symbolB": "AERO",
"routedVolumeUsd": 3100000,
"directVolumeUsd": 600000,
"arbVolumeUsd": 1400000,
"unclassifiedVolumeUsd": 200000,
"pairFeesUsdPerDay": 15386.6,
"pools": 1,
"pricedPools": 1,
"bestCompetitor": null,
"medianCompetitorRatio": null,
"target": {
"kind": "pool",
"pool": "0x6cdcb1c4a4d1c3c6d054b27ac5b77e89eafb971d",
"dex": "aerodrome-slipstream",
"ratio": 1.2219,
"band": "uncovered",
"lpNetRatio": 1.1608,
"coverage": "does-not-cover",
"depthUsd": 207824000,
"feeTierBps": 30
},
"assumedFeeBps": 30,
"screening": {
"capitalUsd": 100000,
"rangePreset": "full",
"lpShare": {
"share": 0.95,
"source": "fee-earning (unstaked) LPs; staked LPs earn emissions and their fees go to voters",
"given": false
},
"feesUsdPerDay": {
"routed": 3.73008,
"direct": 1.6376,
"unclassified": 0.454888,
"arb": 3.27677
},
"lvrUsdPerDay": 7.44918,
"ratioGross": 1.22152,
"ratioLpNet": 1.16045,
"netUsdPerDay": 1.1952,
"netUsdPerDayPer1k": 0.011952,
"horizonDays": 30,
"netUsdHorizon": 35.8559,
"coverage": "covers",
"arbRate": {
"perUnitLPerHour": 0.000133182,
"tierBps": 30,
"match": "same-tier",
"pools": 1
}
},
"pairDepthUsd": 207824000,
"confidence": "low",
"flags": [
"few-competitors"
]
},
{
"tokenA": "0x4200000000000000000000000000000000000006",
"tokenB": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"symbolA": "WETH",
"symbolB": "USDC",
"routedVolumeUsd": 41200000,
"directVolumeUsd": 9800000,
"arbVolumeUsd": 30100000,
"unclassifiedVolumeUsd": 3400000,
"pairFeesUsdPerDay": 256444,
"pools": 2,
"pricedPools": 2,
"bestCompetitor": {
"pool": "0x551a0e3d267bea87048f08cc94cc6035ad99221b",
"dex": "solidly-v3",
"ratio": 0.559632,
"feeBps": 5,
"volumeUsd": 15485
},
"medianCompetitorRatio": 0.559632,
"target": {
"kind": "pool",
"pool": "0x6c561b446416e1a00e8e93e221854d6ea4171372",
"dex": "uniswap-v3",
"ratio": 0.977519,
"band": "uncovered",
"lpNetRatio": 0.814274,
"coverage": "does-not-cover",
"depthUsd": 3463740000,
"feeTierBps": 30
},
"assumedFeeBps": 30,
"screening": {
"capitalUsd": 100000,
"rangePreset": "full",
"lpShare": {
"share": 0.833,
"source": "Uniswap protocol-fee expansion (Base, 2026): 1/4 of the 0.01%/0.05% tiers, 1/6 of 0.3%/1%",
"given": false
},
"feesUsdPerDay": {
"routed": 2.98542,
"direct": 1.31067,
"unclassified": 0.364075,
"arb": 2.62142
},
"lvrUsdPerDay": 7.44918,
"ratioGross": 0.977501,
"ratioLpNet": 0.814259,
"netUsdPerDay": -1.38362,
"netUsdPerDayPer1k": -0.0138362,
"horizonDays": 30,
"netUsdHorizon": -41.5086,
"coverage": "does-not-cover",
"arbRate": {
"perUnitLPerHour": 0.000106546,
"tierBps": 30,
"match": "same-tier",
"pools": 1
}
},
"pairDepthUsd": 3463770000,
"confidence": "medium",
"flags": [
"few-competitors"
]
}
],
"method": "capital scenario: routed (router), direct (diluted) and arbitrage (tier rate) fees over LVR in range; see the method field of a live answer"
}/api/v1/ext/market/lp-opportunity-curveCapital curve per range
For one pool and range preset (full; narrow, medium and wide on concentrated pools): per capital point the routed fees from the production router, the direct and arbitrage fees, LVR while in range, gross and LP-net F/LVR with price, routing and demand uncertainty, and the minimum-viable, most capital-efficient and highest-net capital.
- Cost
- 50 CU
- Headers
- Send your key in x-api-key.
| Body | Required | Description |
|---|---|---|
| chainId | yes | 8453 (Base) or 146 (Sonic). |
| pool | yes | Pool to add capital to. |
| rangePreset | no | full (default), narrow, medium or wide. |
| capitalUsd | no | 1 to 8 capital points (a 10K–5M ladder by default). |
| lpShare | no | LP share override (0–1]. |
| horizonDays | no | 1 to 90 days (30 by default). |
| windowHours | no | History window, 24 to 336 hours (168 by default). |
| taskId | no | Read the curve of a queued request. |
Without taskId the call queues a router run (one at a time and 20 a day per organization) and answers with its taskId; call again with it for the curve.
curl -s -X POST "https://llens.abanchev.com/api/v1/ext/market/lp-opportunity-curve" \
-H "x-api-key: $LL_API_KEY" \
-H "content-type: application/json" \
-d '{"chainId":"8453","pool":"0x6c561b446416e1a00e8e93e221854d6ea4171372","rangePreset":"medium","capitalUsd":["10000","50000","100000","250000","1000000","2500000"],"windowHours":72}'{
"chainId": "8453",
"pool": "0x6c561b446416e1a00e8e93e221854d6ea4171372",
"taskId": "5b0e2c71-9d4a-4c3e-8f21-6a7b8c9d0e1f",
"status": "succeeded",
"curve": {
"rangePreset": "medium",
"halfWidthBps": 1000,
"pairClass": "medium",
"sigmaHourlyBps": 49.4709,
"timeInRange": 1,
"lpShare": {
"share": 0.833,
"source": "Uniswap protocol-fee expansion (Base, 2026): 1/4 of the 0.01%/0.05% tiers, 1/6 of 0.3%/1%",
"given": false
},
"horizonDays": 30,
"windowHours": 72,
"points": [
{
"capitalUsd": 10000,
"addedLiquidity": 1127.67,
"liquidityShare": 0.000032,
"routedVolumeShare": 0.268703,
"feesUsdPerDay": {
"routed": 4.07809,
"direct": 1.44173,
"unclassified": 0.400482,
"arb": 2.88356
},
"lvrUsdPerDay": 8.1941,
"ratioGross": 1.07442,
"ratioLpNet": 0.894988,
"netUsdPerDay": -0.860475,
"netUsdHorizon": -25.8142,
"uncertainty": {
"price": [
0.586223,
1.76841
],
"routing": [
0.84524,
0.944737
],
"demand": [
0.594063,
1.19591
]
}
},
{
"capitalUsd": 50000,
"addedLiquidity": 5638.35,
"liquidityShare": 0.000159,
"routedVolumeShare": 0.569413,
"feesUsdPerDay": {
"routed": 43.2043,
"direct": 7.20775,
"unclassified": 2.00215,
"arb": 14.4178
},
"lvrUsdPerDay": 40.9705,
"ratioGross": 1.63122,
"ratioLpNet": 1.35881,
"netUsdPerDay": 14.7006,
"netUsdHorizon": 441.018,
"uncertainty": {
"price": [
0.890028,
2.68488
],
"routing": [
1.2534,
1.46422
],
"demand": [
0.825974,
1.89165
]
}
},
{
"capitalUsd": 100000,
"addedLiquidity": 11276.7,
"liquidityShare": 0.000317,
"routedVolumeShare": 0.64398,
"feesUsdPerDay": {
"routed": 97.7087,
"direct": 14.4132,
"unclassified": 4.00367,
"arb": 28.8356
},
"lvrUsdPerDay": 81.941,
"ratioGross": 1.76909,
"ratioLpNet": 1.47365,
"netUsdPerDay": 38.8117,
"netUsdHorizon": 1164.35,
"uncertainty": {
"price": [
0.965253,
2.9118
],
"routing": [
1.35446,
1.59285
],
"demand": [
0.883397,
2.06391
]
}
},
{
"capitalUsd": 250000,
"addedLiquidity": 28191.8,
"liquidityShare": 0.000793,
"routedVolumeShare": 0.646306,
"feesUsdPerDay": {
"routed": 245.037,
"direct": 36.0159,
"unclassified": 10.0044,
"arb": 72.089
},
"lvrUsdPerDay": 204.852,
"ratioGross": 1.77272,
"ratioLpNet": 1.47668,
"netUsdPerDay": 97.6487,
"netUsdHorizon": 2929.46,
"uncertainty": {
"price": [
0.967233,
2.91778
],
"routing": [
1.35711,
1.59625
],
"demand": [
0.884908,
2.06845
]
}
},
{
"capitalUsd": 1000000,
"addedLiquidity": 112767,
"liquidityShare": 0.003166,
"routedVolumeShare": 0.646306,
"feesUsdPerDay": {
"routed": 977.822,
"direct": 143.722,
"unclassified": 39.9227,
"arb": 288.356
},
"lvrUsdPerDay": 819.41,
"ratioGross": 1.76935,
"ratioLpNet": 1.47387,
"netUsdPerDay": 388.292,
"netUsdHorizon": 11648.8,
"uncertainty": {
"price": [
0.965392,
2.91223
],
"routing": [
1.35458,
1.59315
],
"demand": [
0.883503,
2.06423
]
}
},
{
"capitalUsd": 2500000,
"addedLiquidity": 281918,
"liquidityShare": 0.007877,
"routedVolumeShare": 0.646306,
"feesUsdPerDay": {
"routed": 2433,
"direct": 357.606,
"unclassified": 99.3349,
"arb": 720.89
},
"lvrUsdPerDay": 2048.52,
"ratioGross": 1.76265,
"ratioLpNet": 1.46829,
"netUsdPerDay": 959.299,
"netUsdHorizon": 28779,
"uncertainty": {
"price": [
0.961737,
2.9012
],
"routing": [
1.34957,
1.58701
],
"demand": [
0.880713,
2.05586
]
}
}
],
"minimumViable": {
"capitalUsd": 19056.2,
"atOrBelow": false
},
"maxCapitalEfficiency": {
"fromCapitalUsd": 50000,
"toCapitalUsd": 100000,
"marginalNetPerUsdPerDay": 0.000482223
},
"maxTotalNet": {
"capitalUsd": 2500000,
"netUsdPerDay": 959.299
},
"matchMedian": {
"capitalUsd": 10000
},
"beatBest": {
"capitalUsd": 10000
},
"competitors": {
"best": 0.559632,
"median": 0.559632
},
"arbRate": {
"perUnitLPerHour": 0.000106546,
"tierBps": 30,
"match": "same-tier",
"pools": 1
},
"backtest": {
"inSample": {
"predictedShare": 0.22,
"observedShare": 0.25,
"error": -0.03
},
"outOfSample": null,
"status": "in-sample-only"
},
"notes": [
"routed fees are a lower bound: only aggregator flow we observe is routed; other contestable flow is unobserved",
"time in range uses hourly closes; moves inside an hour are not seen"
],
"flags": []
},
"error": null,
"method": "the router's depth curve of the aggregator flow with the medium preset; see the method field of a live answer"
}