Endpoints

Pools

Uniswap v4 pools on Ethereum (1) and Avalanche (43114), ranked by TVL, 24h volume, 24h fees, fee APR or age.

GET /v1/pools 2 units

bash
curl -s "https://api.tickwise.xyz/v1/pools?chainId=1&sort=tvl&limit=25" \
  -H "KC-APIKey: $TICKWISE_API_KEY"

Query parameters

ParameterDefaultMeaning
chainIdall chains1 or 43114. Omitting it merges every enabled chain into one ranking.
protocoluniswap-v4The only value served; anything else is a 400.
sorttvltvl, volume, fees, fee_apr or age. Descending except age, which is oldest first. There is no direction parameter.
page11-based.
limit201–100.
minTvlUsd0Floor on pool TVL.
includeRiskyfalseAdmits pools whose tokens have no corroborated on-chain market.
searchCase-insensitive substring over either token symbol, either token address, or the pool id. Up to 64 characters. It is a lookup, not a filter: the spam-token exclusion is skipped while searching, so a pool you name stays findable.

Response

A pools array and the same pagination envelope the positions list uses. Each row carries rank, poolId, chainId, protocol, both token snapshots, fee, isDynamicFee, tickSpacing, currentTick, sqrtPriceX96, liquidity, createdAtTimestamp, a metrics group (tvlUsd, volumeUsd24h, volumeUsd7d, feesUsd24h, feesUsd7d, feeApr, txCount, currentPrice), pricing, and two counts the underlying subgraph does not provide: positionsCount (open positions) and holdersCount (distinct owners).

feeApr is clamped at ±100,000% on the way out. The upstream v4 subgraph’s feesUSD is known to produce values in the hundreds of thousands of percent on thin pools; clamping at read time keeps a stale document from dominating a fee_apr ranking. A value sitting exactly on the cap should be read as “not trustworthy”, not as a measurement.

GET /v1/pools/{chainId}/{protocol}/{poolId} 1 unit

One pool, in the same shape as a list row plus its counts. poolId is validated before anything else happens: a v4 pool id is 0x plus 64 hex characters, a v3 pool address 0x plus 40. Anything else is a 400 with {"error":"Invalid poolId"}, rejected here rather than fanned out to a metered upstream.

bash
curl -s "https://api.tickwise.xyz/v1/pools/1/uniswap-v4/0x…64hex" \
  -H "KC-APIKey: $TICKWISE_API_KEY"

Ids are matched lowercased, so case in the path does not matter. A pool that exists on the other chain is a 404 here.

GET /v1/pools/{chainId}/{protocol}/{poolId}/charts 10 units

?range=30d|60d|90d|180d|all, defaulting to 30d; an unrecognised value falls back to 30d rather than erroring.

bash
curl -s "https://api.tickwise.xyz/v1/pools/1/uniswap-v4/0x…64hex/charts?range=90d" \
  -H "KC-APIKey: $TICKWISE_API_KEY"

Carries poolPrice (daily OHLC), poolOverview, liquidityDistribution (the tick histogram, with no position range marked — that is the difference from the position variant), poolSeries (volume, TVL, fees, fee APR) and poolOverviewCurrent, which is null when the pool has no day data.

As on positions, poolOverview.divergence is always empty: the upstream schema does not carry it, and the key exists so it can be filled later without breaking clients. This route is the expensive one — see units and limits.

Next

Metadata — the free endpoints that tell you which chains and protocols to pass. Positions — the same three shapes for positions.