Skip to main content
Fetch the complete registry of tokenized Overpass wrappers and their latest stats.
GET https://api-v1.overpass.ag/v1/tokens
The endpoint is public and does not require authentication.

Query parameters

ParameterTypeRequiredDescription
protocolstringNoReturn wrappers for one source protocol, such as kamino.
underlyingMintstringNoReturn wrappers backed by one underlying token mint.
limitintegerNoNumber of wrappers to return. Defaults to 100; maximum 500.
cursorstringNoOpaque cursor from the previous response.

Request

Use limit=500 to retrieve the current registry in one request. Continue pagination whenever nextCursor is not null.
curl --get 'https://api-v1.overpass.ag/v1/tokens' \
  --data-urlencode 'limit=500'

Response

{
  "items": [
    {
      "wrapperMint": "HtnnuzVtecjktsUoZjHaZoZ9u4jPAzGpujE82U3v3cAV",
      "wrapperVault": "9iJeZPrNJrBEjj4h7tD9P3hygyM4hpZmyqrQmHjNUpdA",
      "underlyingMint": "So11111111111111111111111111111111111111112",
      "sourcePool": "HaVsdBb4mMoYQ3vnS7wCdvhixg5xFQALmFwyL9QJm3fn",
      "protocol": "kamino",
      "creator": "UserevMsvU5K9u6iW7DT9XJVyVLpmfDCEAfXixBbE7R",
      "creationTimestamp": "2026-05-19T10:46:22.000Z",
      "decimals": 9,
      "underlyingDecimals": 9,
      "name": "SOL in Kamino Sanctum Market",
      "symbol": "infSOL",
      "uri": "https://ipfs.io/ipfs/Qmaph9w7nvQ7D6wsUq4Z8EB3YqurH7b3RsaTbAQtcHs94Z",
      "imageUrl": "https://ipfs.io/ipfs/QmeyFwBddBQZ9hJGu2waW4wPPN2qqyxMApfXXT2VujAfmS",
      "creatorDepositFeeBps": 0,
      "sampledAt": "2026-07-10T00:32:58.000Z",
      "slot": "431906361",
      "underlyingHeldRaw": "4860547156821",
      "wrapperSupplyRaw": "4822869747063",
      "navPerWrapper": 1.007812238,
      "underlyingPriceUsd": 77.97507993366663,
      "priceUsd": 78.58423981617747,
      "tokenizedTvlUsd": 379001.5530744735,
      "underlyingPoolTvlUsd": 1066853.7523347072,
      "liveApy": 0.08646796988090966,
      "cumulativeApy": 0.06981283141486361,
      "cumulativeGrowthPct": 0.007811890304898039,
      "performanceStartTimestamp": "2026-05-28T22:26:07.000Z",
      "totalVolumeUnderlyingRaw": "30160264546962",
      "totalVolumeUsd": 2338319.210438918,
      "cumulativeInterestUnderlyingRaw": "20046445833",
      "cumulativeInterestUsd": 1549.1625237776943,
      "stateSlot": "431906345",
      "stateUpdatedAt": "2026-07-10T00:32:59.670Z",
      "priceUpdatedAt": "2026-07-10T00:32:59.670Z",
      "poolUpdatedAt": "2026-07-10T00:32:59.670Z",
      "apyUpdatedAt": "2026-07-10T00:32:59.670Z",
      "staleFlags": []
    }
  ],
  "nextCursor": null
}
Live values in the response change as Overpass samples the wrapper and its source pool.

Field semantics

FieldsDescription
wrapperMint, wrapperVault, underlyingMint, sourcePool, protocolAddresses and protocol needed to identify and route the wrapper.
underlyingHeldRaw, wrapperSupplyRawInteger token amounts encoded as strings. Scale them using underlyingDecimals and decimals.
navPerWrapperUnderlying tokens redeemable per wrapper token before transaction-specific slippage.
underlyingPriceUsd, priceUsdCurrent USD prices for the underlying and wrapper tokens.
tokenizedTvlUsdCurrent value held by the Overpass wrapper.
underlyingPoolTvlUsdTotal value in the external source pool, not the wrapper TVL.
liveApy, cumulativeApy, cumulativeGrowthPctDecimal fractions. For example, 0.0864 represents 8.64%.
totalVolumeUnderlyingRaw, totalVolumeUsdCumulative wrapper deposits and withdrawals.
cumulativeInterestUnderlyingRaw, cumulativeInterestUsdCumulative interest attributed to wrapper holders.
sampledAt, stateUpdatedAt, priceUpdatedAt, poolUpdatedAt, apyUpdatedAtSampling and source-specific freshness timestamps.
staleFlagsSources that are outside their freshness threshold. An empty array means no source is currently flagged stale.
Nullable fields have not been observed or cannot currently be calculated. Do not replace them with zero.

Paginate through every wrapper

const tokens: Array<Record<string, unknown>> = [];
let cursor: string | null = null;

do {
  const params = new URLSearchParams({ limit: "500" });
  if (cursor) params.set("cursor", cursor);

  const response = await fetch(
    `https://api-v1.overpass.ag/v1/tokens?${params}`,
  );

  if (!response.ok) {
    throw new Error(`Overpass token request failed: ${response.status}`);
  }

  const page = await response.json();
  tokens.push(...page.items);
  cursor = page.nextCursor;
} while (cursor);
Treat nextCursor as opaque. Do not construct or modify it.

Filter wrappers

Fetch every Kamino-backed wrapper:
curl --get 'https://api-v1.overpass.ag/v1/tokens' \
  --data-urlencode 'protocol=kamino' \
  --data-urlencode 'limit=500'
Fetch wrappers for one underlying mint:
curl --get 'https://api-v1.overpass.ag/v1/tokens' \
  --data-urlencode 'underlyingMint=So11111111111111111111111111111111111111112'
You can combine both filters.

Fetch one wrapper

Use a wrapper mint to fetch one token and the same stats without a paginated envelope.
GET https://api-v1.overpass.ag/v1/tokens/:wrapperMint
curl 'https://api-v1.overpass.ag/v1/tokens/HtnnuzVtecjktsUoZjHaZoZ9u4jPAzGpujE82U3v3cAV'
The endpoint returns 404 with {"error":"not_found"} when the wrapper does not exist. Use wrapperMint and underlyingMint from this response to get a swap quote.