---
title: "Backtest a ±rangePct% range (0 = full range) over the last N days"
method: GET
path: "/v1/pools/{chain}/{address}/backtest"
tags: ["pools"]
---

# Backtest a ±rangePct% range (0 = full range) over the last N days

`GET /v1/pools/{chain}/{address}/backtest`

## Request

- Base URL: `https://api.lpsignal.app`
- URL: `https://api.lpsignal.app/v1/pools/{chain}/{address}/backtest`
- Auth: none required

Rate limited separately (30 a minute per key or IP).

## Path parameters

- `chain` 'ethereum' | 'bsc' | 'base' | 'arbitrum' | 'optimism' | 'polygon' | 'robinhood', required
- `address` string, required: pool address, or a Uniswap v4 pool id

## Query parameters

- `rangePct` number, required
- `days` integer

## Response `200`

OK

- object
  - `windowHours` integer
  - `rangeBp` integer: half-width of the range in basis points of price; 0 = full range
  - `tickLower` integer
  - `tickUpper` integer
  - `exact` boolean: every hour has exact (feeGrowth) fees; only exact figures fire signals
  - `feeApr` number: fees earned, annualised (a fraction: 0.42 = 42%)
  - `ilApr` number: impermanent loss vs holding, annualised (≤ 0) (a fraction: 0.42 = 42%)
  - `netApr` number: feeApr + ilApr (a fraction: 0.42 = 42%)
  - `inRangeRatio` number: share of the window the price spent in the range (a fraction: 0.42 = 42%)
  - `asOf` string, date-time
  - `chain` 'ethereum' | 'bsc' | 'base' | 'arbitrum' | 'optimism' | 'polygon' | 'robinhood'
  - `address` string
  - `days` integer
  - `startTick` integer
  - `endTick` integer
  - `uncertainFeeApr` number: fees of hours straddling a range edge (a fraction: 0.42 = 42%)
  - `feesExact` boolean

## Other responses

- `400`: invalid request
- `404`: not found
- `429`: rate limited (Retry-After)

---

[API](https://skmtc.dev/lpsignal/apis/lpsignal-api.md) · [All operations](https://skmtc.dev/lpsignal/apis/lpsignal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lpsignal/apis/lpsignal-api/revisions/5fb8c06b1930?raw)
