REST API
List markets, a wallet's positions and activity, and protocol stats from the indexer's /api/v1 routes, with paging and caching.
Updated Nov 9, 2026
The indexer serves two API families from one base URL. The /api/v1 routes on this page are the market, user and position endpoints the app and the SDK's dusk.fetch client use for lists and history. The /api/dusk/v1 routes on the read API and streams page are the native Dusk snapshots, event history and change streams.
https://api.indexer.omnipair.fi/api/v1Responses are JSON. Amounts are decimal strings in token atoms unless a field is explicitly USD; public keys and signatures are base58. List endpoints take limit and offset.
Markets
| Method and path | Parameters | Returns |
|---|---|---|
GET /pools | token0, token1, limit (default 100, max 1,000), offset, sortBy (tvl, volume24h, apr), sortOrder | Market list with reserves, TVL and fee settings |
GET /pools/{market} | One market | |
GET /pools/{market}/stats | windowHours (default 24) | Volume, fees, trade count, price change, swap APY |
GET /pools/{market}/volume | windowHours | Volume breakdown |
GET /pools/{market}/fees | windowHours | Fees: total, LP share, protocol share |
GET /pools/{market}/price-chart | windowHours | Price series; one-minute candles up to 24 h, hourly to a week, daily beyond |
GET /pools/{market}/candles | resolution, from, to | OHLCV candles |
GET /pools/{market}/swaps | limit, offset or from, to, cursor | Swap rows |
GET /pools/{market}/liquidity-events | userAddress | Add and remove events |
GET /pools/{market}/rate-history | range | Borrow rate history |
GET /pools/{market}/activity | limit, categories | Mixed activity feed |
GET /pools/value-baselines | range, visibility | Values used for change indicators |
GET /pools/paired-tokens/{mint} | Markets containing a token |
Users
| Method and path | Parameters | Returns |
|---|---|---|
GET /users/{owner}/activity | limit, categories, poolAddress | Aggregated wallet activity |
GET /users/{owner}/swaps | poolAddress, limit, offset | Swap history |
GET /users/{owner}/liquidity-events | LP history | |
GET /users/{owner}/lending-events | Borrow, repay and liquidation history | |
GET /users/{owner}/positions | poolAddress, type (liquidity, lending, borrow, long, short, all), status (open, closed, all) | Positions |
GET /users/{owner}/portfolio-snapshots | range | Portfolio value history |
GET /users/{owner}/lp-earnings | range, poolAddress | LP earnings |
Positions and stats
| Method and path | Parameters | Returns |
|---|---|---|
GET /positions | userAddress, poolAddress, type, status, limit, offset | Positions across markets |
GET /positions/liquidity | Liquidity positions | |
GET /positions/{id} | One position | |
GET /stats | Protocol-wide totals |
The same server also exposes GeckoTerminal, CoinGecko and CoinMarketCap-compatible routes; dusk.fetch.request(path) reaches any of them.
Using it from the SDK
const pools = await dusk.fetch.pools({ limit: 50, sortBy: "tvl", sortOrder: "desc" })
const activity = await dusk.fetch.poolActivity(market, {
categories: ["swaps", "liquidity", "lending"],
limit: 100,
})
const snapshots = await dusk.fetch.userPortfolioSnapshots(owner, "30D")Limits, caching and errors
- Rate limit: 100 requests per 60 seconds on the default tier. Over the limit you get
429; back off exponentially. - Caching: market info about 10 seconds, statistics about 30, price charts about 60. For anything a decision depends on, read the program through the SDK instead.
- Errors share one shape:
{ "success": false, "error": { "code": "ERROR_CODE", "message": "Description" } }| Status | Meaning |
|---|---|
| 400 | Invalid parameters |
| 404 | Not found |
| 429 | Rate limit exceeded |
| 500 | Internal error |