Skip to content

Prices

Real-time DEX token prices derived from on-chain pool state. Zero RPC — pure in-memory math.

Free, no auth required. Anonymous requests are cached briefly. Free, Starter, Growth, and Pro API keys bypass the anonymous cache and get higher limits.

Pricing Strategy

Prices are computed using a two-strategy approach:

  1. Direct: Token has USDC or USDT pools → price computed directly from pool state
  2. Multi-hop: Token has no stablecoin pools → price derived via an intermediate token (e.g. BTC/SOL × SOL/USDC). The best intermediate is selected automatically, preferring SOL for liquidity.

The route field in the response tells you which strategy was used.

GET /v1/price/:token

Get the current DEX price for a single token.

Parameters:

  • :token — Tracked token symbol (SOL, WBTC, JUP)

Response (success):

json
{
  "token": "SOL",
  "priceUsd": 80.31,
  "bestBid": 80.07,
  "bestAsk": 80.54,
  "bestBidPool": "BmXVhzBHTawt5stWKBtFdjM8n33G5RoUDECE5FrRvayq",
  "bestAskPool": "AhhoxZDmsg2snm85vPjqzYzEYESoKfb4KmTj4HrBBNwY",
  "bestBidDex": "orca-whirlpool",
  "bestAskDex": "orca-whirlpool",
  "bestBidFeeBps": 1,
  "bestAskFeeBps": 1,
  "poolCacheAgeMs": 150,
  "confidence": "confirmed",
  "poolCount": 31,
  "timestamp": 1712000000000,
  "route": "direct",
  "change24h": -1.42
}

Response (multi-hop):

json
{
  "token": "TRUMP",
  "priceUsd": 2.83,
  "bestBid": 2.82,
  "bestAsk": 2.84,
  "bestBidPool": "...",
  "bestAskPool": "...",
  "bestBidDex": "raydium-clmm",
  "bestAskDex": "raydium-clmm",
  "bestBidFeeBps": 10,
  "bestAskFeeBps": 10,
  "poolCacheAgeMs": 55000,
  "poolCount": 1,
  "timestamp": 1712000000000,
  "route": "TRUMP/SOL × SOL/USDC"
}

Response (unavailable — 404):

json
{
  "token": "UNKNOWN",
  "status": "unavailable",
  "reason": "No active pools found for this token"
}

Fields:

FieldDescription
priceUsdMid-market price (average of bestBid and bestAsk)
bestBidBest price to sell token → stablecoin (after pool fees)
bestAskBest price to buy token with stablecoin (after pool fees)
bestBidFeeBpsFee (basis points) of the pool providing the best bid
bestAskFeeBpsFee (basis points) of the pool providing the best ask
poolCacheAgeMsAge of freshest pool data used. -1 = no recent updates.
confidence"confirmed" (verified on-chain state) or "optimistic" (predicted state, ~200ms fresher than confirmed)
optimisticAgeMsOnly present when confidence === "optimistic". Milliseconds since the prediction was applied. Optimistic prices are typically confirmed within 400ms.
poolCountNumber of valid pools checked (outliers excluded)
route"direct" or "TOKEN/X × X/USDC" — how the price was derived
change24h24h price change in percent (e.g. -2.34 = down 2.34 %). Sourced from DefiLlama, refreshed every few minutes server-side. Omitted when DefiLlama has no data for the symbol yet (e.g. very new listings).

GET /v1/prices?tokens=SOL,BTC,ETH

Batch price for multiple tokens in one request.

Query parameters:

  • tokens — Comma-separated list (max 50), mixing catalog symbols (SOL, USDC — case-insensitive) and/or raw mint addresses (base58) freely. Symbols resolve against the catalog; anything else that looks like a mint is priced from our own indexed pools (see Arbitrary mints below). Each result is keyed by exactly what you passed — the upper-cased symbol, or the mint verbatim.

Response:

json
{
  "prices": {
    "SOL": {
      "token": "SOL",
      "priceUsd": 80.31,
      "bestBid": 80.07,
      "bestAsk": 80.54,
      "poolCacheAgeMs": 150,
      "poolCount": 31,
      "route": "direct",
      ...
    },
    "BTC": {
      "token": "BTC",
      "priceUsd": 66854.19,
      "poolCacheAgeMs": 24000,
      "poolCount": 1,
      "route": "direct",
      ...
    },
    "WIF": {
      "status": "unavailable",
      "reason": "No active pools found"
    },
    "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump": {
      "token": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "priceUsd": 0.0142,
      "route": "direct",
      "poolCount": 2,
      ...
    }
  },
  "timestamp": 1712000000000
}

Catalog tokens without active pools return { "status": "unavailable" } instead of being omitted. Unknown symbols are ignored. A mint we don't index a USD route for returns { "status": "unavailable", "reason": "No indexed USD route for this mint" }.

Arbitrary-mint pricing

?tokens= (and the single /v1/tokens/:mint priceUsd field) price any mint — not just the curated catalog — from our own indexed pool state, using the same depth-anchored, liquidity-decides engine as catalog tokens. There is no third-party price feed in the path: USDC/USDT are the USD anchors and the routing intermediates (e.g. SOL) are catalog tokens we already price, so a mint needs no catalog entry.

  • For an arbitrary mint, token in the result is the mint address (no symbol lookup is performed) and route is "direct" or "<mint>/<intermediate> × <intermediate>/USDC".
  • We can only price a mint whose pools we've indexed. A never-seen mint returns "unavailable" rather than reaching out to an external source.
  • The price math is in-memory pool state. The mint's decimals are read once from its on-chain SPL mint account (authoritative — never guessed from pool data) and cached permanently, so the first time a given mint is priced costs one batched account lookup and every subsequent request is served from cache. Catalog symbols never do this. Net: batch requests stay fast in steady state.

Notes

  • Free, Starter, Growth, and Pro API keys bypass the anonymous cache on this endpoint.

Rate Limits

See Plans & Rate Limits for full tier details.

Anonymous: 30/min (cached 2s). Free: 60/min. Starter: 300/min. Growth: 600/min. Pro: 1000/min. Internal: unlimited (fresh, no cache).