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/v1

Responses 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 pathParametersReturns
GET /poolstoken0, token1, limit (default 100, max 1,000), offset, sortBy (tvl, volume24h, apr), sortOrderMarket list with reserves, TVL and fee settings
GET /pools/{market}One market
GET /pools/{market}/statswindowHours (default 24)Volume, fees, trade count, price change, swap APY
GET /pools/{market}/volumewindowHoursVolume breakdown
GET /pools/{market}/feeswindowHoursFees: total, LP share, protocol share
GET /pools/{market}/price-chartwindowHoursPrice series; one-minute candles up to 24 h, hourly to a week, daily beyond
GET /pools/{market}/candlesresolution, from, toOHLCV candles
GET /pools/{market}/swapslimit, offset or from, to, cursorSwap rows
GET /pools/{market}/liquidity-eventsuserAddressAdd and remove events
GET /pools/{market}/rate-historyrangeBorrow rate history
GET /pools/{market}/activitylimit, categoriesMixed activity feed
GET /pools/value-baselinesrange, visibilityValues used for change indicators
GET /pools/paired-tokens/{mint}Markets containing a token

Users

Method and pathParametersReturns
GET /users/{owner}/activitylimit, categories, poolAddressAggregated wallet activity
GET /users/{owner}/swapspoolAddress, limit, offsetSwap history
GET /users/{owner}/liquidity-eventsLP history
GET /users/{owner}/lending-eventsBorrow, repay and liquidation history
GET /users/{owner}/positionspoolAddress, type (liquidity, lending, borrow, long, short, all), status (open, closed, all)Positions
GET /users/{owner}/portfolio-snapshotsrangePortfolio value history
GET /users/{owner}/lp-earningsrange, poolAddressLP earnings

Positions and stats

Method and pathParametersReturns
GET /positionsuserAddress, poolAddress, type, status, limit, offsetPositions across markets
GET /positions/liquidityLiquidity positions
GET /positions/{id}One position
GET /statsProtocol-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" } }
StatusMeaning
400Invalid parameters
404Not found
429Rate limit exceeded
500Internal error