Developers

Deneb REST API v1 — market data

Public read-only REST API for coins, pools, limit orders, the BIP price series and the trades of a coin. Every endpoint here is a GET; the API never takes a body and never writes.

Conventions

  • Base URL: https://api.denebnav.app/v1. All paths below are relative to it. Use only this host; internal paths change.

  • Format: JSON, UTF-8. Every answer carries X-Content-Type-Options: nosniff.

  • Amounts are decimal strings with 18 fractional digits ("2380.721002496072294651"), never JSON numbers. 1 coin = 10^18 pip; the API returns coin units, so parse them as strings or bigint, never Number.

  • Prices are decimal strings too. A coin's price_bip / price_usd is the price of 1 coin in BIP / USD; a trade or candle price is quoted in the counter coin (or quote) per 1 of the page's coin. Order price is the node's value and may carry more than 18 fractional digits. Shares (share, top10_share) are decimal strings with 4 fractional digits.

  • Ids are JSON numbers (coin.id, pool.id, order.id). A coin reference is {id, symbol}.

  • Block height is a JSON number. Time is RFC 3339 in UTC ("2026-10-20T08:18:49Z") in every chain answer and in source.time / source.updated_at. The coin market endpoints are the exception: candle and trade time, and the candle from / to, are Unix seconds.

  • Identifiers: an address is Mx + 40 hex, a transaction hash Mt + 64 hex. They are returned with that prefix; path parameters are case-insensitive.

  • Pagination comes in three shapes:

  • Explorer pages — /v1/pools, /v1/pools/coins/{a}/{b}/orders and /v1/orders: page (1-based, up to

  1. and limit (default 50, max 150); the answer is {data, links, meta} with meta.current_page, meta.last_page, meta.per_page, meta.total. links.next / links.prev are null at the ends.

  • Cursor — /v1/coins/…/trades: pass before (the value of next from the previous page) to walk older trades.

  • Window — /v1/coins/…/candles takes from / to in Unix seconds; /v1/pools/orders/{id}, /v1/coins, /v1/pools/coins/{a}/{b} and /v1/prices/series are not paged.

  • Errors have one shape, {"error": {"code": "...", "message": "..."}}, with Cache-Control: no-store. The message is for developers; pick UI text by code. Common codes: bad_request (400), not_found (404), unavailable (503), upstream (502), internal (500), warming_up (503, the coin registry is still loading). The one exception is 429 from the rate limiter: the proxy answers it without a JSON body (see Access).

  • Caching: Cache-Control: public, max-age=5 for coins, pools, orders and the price series; public, max-age=10 for candles and trades; public, max-age=60 for holders. Errors are no-store.

  • source object. Coins, pools, orders and the price series carry the standard source: where the data came from and how fresh it is. Fields: height (head height the node parts were read at), time, parts (field group → data source, e.g. "node", "pools", "pools-api", "explorer-api"; for pools and pool orders it also names trade_volume_bip_1d and trade_volume_bip_30d), stale (groups whose last refresh failed and are served older), and optional coverage (completeness of a volume window), note and price. price is present on coin and pool answers: the BIP/USD valuation — height, method (liquidity_weighted_stable_pools), min_stable_usd, and pools[] with id, coin ({id, symbol}), bip_reserve, stable_reserve, bip_price_usd, weight, and optional excluded + reason (a pool left out of the valuation). It is omitted from the short examples below. A coverage entry has window, from, complete, and, when the window is complete, complete_from_height and complete_from_time. The coin market endpoints (candles, trades, holders) carry a smaller source instead: index, history_from, updated_at, and sometimes note or trades_without_bip_price — see each endpoint. Ignore source in a first integration; it is not a request parameter.

Access

The API is open now: no key, no authentication. There is a per-IP rate limit — currently 30 requests per second with a burst of up to 60; above it the answer is 429 with no JSON body. Keys issued in the portal cabinet are not checked yet — send requests without one. Per-key quotas will come later; the open, keyless tier described on this page stays available.

Coins

GET /v1/coins

Every coin the registry knows: bonded coins, tokens and pool (LP) tokens — the whole list in one answer.

No parameters. The list is not paged and can be large; fetch it once and keep it, or use the two endpoints below for a single coin.

curl https://api.denebnav.app/v1/coins
{
  "data": [
    {
      "id": 0,
      "crr": 100,
      "volume": "89558.137234329718283132",
      "reserve_balance": "0.000000000000000000",
      "max_supply": "10000000000.000000000000000000",
      "name": "Base coin",
      "symbol": "BIP",
      "owner_address": null,
      "burnable": false,
      "mintable": false,
      "type": "coin",
      "trading_volume_24h": "1250000.000000000000000000",
      "trading_volume_1mo": "30100000.000000000000000000",
      "price_usd": "0.031200000000000000",
      "price_bip": "1.000000000000000000",
      "price_method": "base"
    },
    {
      "id": 4404,
      "crr": 0,
      "volume": "1200000.000000000000000000",
      "reserve_balance": "0.000000000000000000",
      "max_supply": "1000000000.000000000000000000",
      "name": "Onyx",
      "symbol": "ONY",
      "owner_address": "Mx0000000000000000000000000000000000000001",
      "burnable": true,
      "mintable": true,
      "type": "token",
      "trading_volume_24h": "71090.221287645544210029",
      "trading_volume_1mo": "2040000.000000000000000000",
      "price_usd": "0.000003432000000000",
      "price_bip": "0.000110000000000000",
      "price_method": "pool"
    }
  ],
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": {
      "coins": "node:registry@42105678 2026-10-20T08:18:45Z",
      "trade_volume_bip_1d": "pools-api",
      "trade_volume_bip_30d": "pools-api",
      "valuation": "pools"
    },
    "stale": []
  }
}
FieldTypeMeaning
idnumbercoin id; 0 is BIP
crrnumberconstant reserve ratio, percent; 100 for BIP
volumestringcurrent supply, decimal string; for BIP, the current emission
reserve_balancestringreserve in BIP, decimal string
max_supplystringmaximum supply, decimal string
namestringdisplay name; BIP is Base coin
symbolstringticker
owner_addressstring \nullcoin owner, null when there is none
burnablebooleanthe coin can be burned
mintablebooleanthe coin can be minted
typestringcoin (bonded), token or pool_token
trading_volume_24hstring24 h trading volume valued in BIP, decimal string
trading_volume_1mostring30 day trading volume valued in BIP, decimal string
price_usdstringcoin price in USD, decimal string
price_bipstringcoin price in BIP, decimal string
price_methodstringhow price_bip was derived: base, pool, curve, route, lp or none (unpriced)

price_method values: base — BIP itself; pool — mid price of the coin/BIP pool; curve — bonding curve; route — through one intermediate coin with a BIP price; lp — an LP token; none — no price, valued at 0. trading_volume_* is "0.000000000000000000" when the coin has no volume or no BIP price.

503 warming_up while the coin registry is loading; 502 upstream when the node is unavailable.

Cache-Control: public, max-age=5.

GET /v1/coins/id/{id}

One coin by id, with live supply and reserve.

Path parameter id: a coin id, a decimal number up to 32 bits.

curl https://api.denebnav.app/v1/coins/id/4404

The data object has exactly the same fields as one row of GET /v1/coins. 404 not_found (coin not found) for an id the chain does not know; 400 bad_request for a non-numeric id; 503 warming_up while the coin registry is loading; 502 upstream when the node is unavailable.

Cache-Control: public, max-age=5.

GET /v1/coins/symbol/{symbol}

One coin by ticker. Path parameter symbol: 1–32 letters, digits or -, case-insensitive.

curl https://api.denebnav.app/v1/coins/symbol/ONY

The data object has exactly the same fields as one row of GET /v1/coins. 404 not_found for an unknown ticker; 400 bad_request when the symbol does not match the allowed shape; 503 warming_up while the coin registry is loading; 502 upstream when the node is unavailable.

Cache-Control: public, max-age=5.

Pools and limit orders

GET /v1/pools

All swap pools, deepest liquidity first (by liquidity_bip).

Query parameters:

ParameterDefaultLimitsMeaning
coin—symbol or numeric idonly pools that contain this coin; 404 when it is unknown
page11..1000001-based page
limit501..150pools per page
curl 'https://api.denebnav.app/v1/pools?coin=ONY&limit=1'
{
  "data": [
    {
      "coin0": { "id": 0, "symbol": "BIP" },
      "coin1": { "id": 4404, "symbol": "ONY" },
      "token": { "id": 4410, "symbol": "LP-1825" },
      "amount0": "10240.500000000000000000",
      "amount1": "93100000.000000000000000000",
      "liquidity": "30905.000000000000000000",
      "liquidity_bip": "20481.000000000000000000",
      "trade_volume_bip_1d": "7109.022128764554421002",
      "trade_volume_bip_30d": "204000.000000000000000000",
      "updated_at_block": 42105677,
      "id": 1825,
      "open_orders": 7
    }
  ],
  "links": {
    "first": "/v1/pools?coin=ONY&limit=1&page=1",
    "last": "/v1/pools?coin=ONY&limit=1&page=1",
    "prev": null,
    "next": null
  },
  "meta": { "current_page": 1, "last_page": 1, "path": "/v1/pools", "per_page": 1, "total": 1 },
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": {
      "pools": "node@42105677",
      "trade_volume_bip_1d": "pools-api",
      "trade_volume_bip_30d": "pools-api",
      "valuation": "pools"
    },
    "stale": [],
    "coverage": {
      "trade_volume_bip_1d": {
        "window": "24h",
        "from": "2026-10-19T08:17:49Z",
        "complete": true,
        "complete_from_height": 42097000,
        "complete_from_time": "2026-10-19T08:20:01Z"
      },
      "trade_volume_bip_30d": {
        "window": "30d",
        "from": "2026-09-20T08:17:49Z",
        "complete": false
      }
    }
  }
}
FieldTypeMeaning
idnumberpool id
coin0 / coin1objectthe two pool coins, {id, symbol}
tokenobjectthe LP token; {id: 0, symbol: "LP-<pool id>"} when the LP coin is not in the registry
amount0 / amount1stringpool reserves of coin0 / coin1, decimal strings
liquiditystringpool liquidity as the node reports it, decimal string
liquidity_bipstringliquidity valued in BIP, decimal string; the sort key
trade_volume_bip_1dstring24 h trading volume valued in BIP, decimal string
trade_volume_bip_30dstring30 day trading volume valued in BIP, decimal string
updated_at_blocknumberblock height the pool snapshot was read at
open_ordersnumberopen limit orders in the pool

source.coverage (optional) says how complete a volume window is; source.stale lists a part served older.

400 bad_request for a bad page or limit, or a coin that does not match the coin shape; 404 not_found for an unknown coin; 503 warming_up while the coin registry is loading; 502 upstream when the node is unavailable.

Cache-Control: public, max-age=5.

GET /v1/pools/coins/{a}/{b}

One pool by its two coins. Path parameters a and b: coin symbols or numeric ids, case-insensitive; the order does not matter.

curl https://api.denebnav.app/v1/pools/coins/ONY/BIP
{
  "data": {
    "coin0": { "id": 0, "symbol": "BIP" },
    "coin1": { "id": 4404, "symbol": "ONY" },
    "token": { "id": 4410, "symbol": "LP-1825" },
    "amount0": "10240.500000000000000000",
    "amount1": "93100000.000000000000000000",
    "liquidity": "30905.000000000000000000",
    "liquidity_bip": "20481.000000000000000000",
    "trade_volume_bip_1d": "7109.022128764554421002",
    "trade_volume_bip_30d": "204000.000000000000000000",
    "updated_at_block": 42105677,
    "id": 1825,
    "open_orders": 7
  },
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": {
      "pools": "node@42105677",
      "trade_volume_bip_1d": "pools-api",
      "trade_volume_bip_30d": "pools-api",
      "valuation": "pools"
    },
    "stale": []
  }
}

data has the same fields as a row of GET /v1/pools. 404 not_found when a coin is unknown (coin not found) or the pair has no pool (pool not found); 400 bad_request when a parameter has a bad shape.

Cache-Control: public, max-age=5.

GET /v1/pools/coins/{a}/{b}/orders

The limit orders of one pool, newest first.

Path parameters a and b as above. Query parameters:

ParameterDefaultLimitsMeaning
status—active, partially_filled, filled, canceled, expiredfilter by status; empty means open orders only
page11..1000001-based page
limit501..150orders per page

The node keeps open orders only. status=active and status=partially_filled (and no status) return them; filled, canceled and expired answer with an empty list and a source.note saying that completed orders are not available yet. source.parts.initial_volumes is explorer-api: the initial volumes are read from history, and source.stale contains initial_volumes when they could not be fetched (then the remaining volumes stand in for them).

curl 'https://api.denebnav.app/v1/pools/coins/BIP/ONY/orders?status=active&limit=1'
{
  "data": [
    {
      "id": 114027,
      "address": "Mx0000000000000000000000000000000000000002",
      "pool_id": 1825,
      "initial_coin_to_buy_volume": "110.190642527175818808",
      "coin_to_buy_volume": "110.190642527175818808",
      "initial_coin_to_sell_volume": "367302.141757252729359720",
      "coin_to_sell_volume": "367302.141757252729359720",
      "coin_to_sell": { "id": 4404, "symbol": "ONY" },
      "coin_to_buy": { "id": 0, "symbol": "BIP" },
      "height": 42100000,
      "status": "active",
      "price": "3333.3333333333333333307922827179787231"
    }
  ],
  "links": {
    "first": "/v1/pools/coins/BIP/ONY/orders?status=active&limit=1&page=1",
    "last": "/v1/pools/coins/BIP/ONY/orders?status=active&limit=1&page=1",
    "prev": null,
    "next": null
  },
  "meta": { "current_page": 1, "last_page": 1, "path": "/v1/pools/coins/BIP/ONY/orders", "per_page": 1, "total": 1 },
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": {
      "pools": "node@42105677",
      "trade_volume_bip_1d": "pools-api",
      "trade_volume_bip_30d": "pools-api",
      "orders": "node",
      "initial_volumes": "explorer-api"
    },
    "stale": []
  }
}
FieldTypeMeaning
idnumberorder id
addressstringowner address
pool_idnumberpool the order belongs to
initial_coin_to_buy_volumestringamount to buy when the order was created, decimal string
coin_to_buy_volumestringamount still to buy, decimal string
initial_coin_to_sell_volumestringamount to sell when the order was created, decimal string
coin_to_sell_volumestringamount still to sell, decimal string
coin_to_sell / coin_to_buyobject{id, symbol} of the two coins
heightnumberblock height the order was created at
statusstringactive or partially_filled (open); a history status when it is not open
pricestringlimit price: coin_to_sell per 1 coin_to_buy, decimal string

status is partially_filled when part of the sell volume is already gone. An order whose remaining sell volume equals the initial one is active.

404 not_found for an unknown coin or pair; 400 bad_request for a bad status, page, limit or path coin. Cache-Control: public, max-age=5.

GET /v1/pools/orders/{id}

One limit order by id. Path parameter id: a decimal order id.

curl https://api.denebnav.app/v1/pools/orders/114027
{
  "id": 114027,
  "address": "Mx0000000000000000000000000000000000000002",
  "pool_id": 1825,
  "initial_coin_to_buy_volume": "110.190642527175818808",
  "coin_to_buy_volume": "110.190642527175818808",
  "initial_coin_to_sell_volume": "367302.141757252729359720",
  "coin_to_sell_volume": "367302.141757252729359720",
  "coin_to_sell": { "id": 4404, "symbol": "ONY" },
  "coin_to_buy": { "id": 0, "symbol": "BIP" },
  "height": 42100000,
  "status": "active",
  "price": "3333.3333333333333333307922827179787231",
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": { "order": "node", "initial_volumes": "explorer-api" },
    "stale": []
  }
}

The order object is not wrapped in data: its fields are at the top level, next to source, and are the same as a row of the pool orders list. An order that is no longer open but is known to history is answered with its historical fields; when history still reports it as active or partially_filled, the status becomes closed, source.stale contains status and source.note explains why. price is empty for such a historical answer. 404 not_found for an unknown id or an id that is neither open nor in history; 400 bad_request for a non-numeric id.

Cache-Control: public, max-age=5.

GET /v1/orders

All open limit orders across all pools, newest (highest id) first.

Query parameters:

ParameterDefaultLimitsMeaning
status—active, partially_filled, filled, canceled, expiredfilter by status; empty means open orders only
page11..1000001-based page
limit501..150orders per page

The same rule as the pool orders list applies: only open orders exist, so filled, canceled and expired return an empty list with a source.note.

curl 'https://api.denebnav.app/v1/orders?status=active&limit=1'
{
  "data": [
    {
      "id": 114027,
      "address": "Mx0000000000000000000000000000000000000002",
      "pool_id": 1825,
      "initial_coin_to_buy_volume": "110.190642527175818808",
      "coin_to_buy_volume": "110.190642527175818808",
      "initial_coin_to_sell_volume": "367302.141757252729359720",
      "coin_to_sell_volume": "367302.141757252729359720",
      "coin_to_sell": { "id": 4404, "symbol": "ONY" },
      "coin_to_buy": { "id": 0, "symbol": "BIP" },
      "height": 42100000,
      "status": "active",
      "price": "3333.3333333333333333307922827179787231"
    }
  ],
  "links": {
    "first": "/v1/orders?status=active&limit=1&page=1",
    "last": "/v1/orders?status=active&limit=1&page=1",
    "prev": null,
    "next": null
  },
  "meta": { "current_page": 1, "last_page": 1, "path": "/v1/orders", "per_page": 1, "total": 1 },
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": { "pools": "node@42105677", "orders": "node", "initial_volumes": "explorer-api" },
    "stale": []
  }
}

data[] has the same fields as a row of the pool orders list.

400 bad_request for a bad status, page or limit; 502 upstream when the node is unavailable. Cache-Control: public, max-age=5.

Coin market data

These three endpoints accept a coin either as symbol/<SYMBOL> or as id/<ID>; for example /v1/coins/symbol/ONY/candles and /v1/coins/id/4404/candles are the same. A symbol is 1–24 letters, digits or -, case-insensitive; an id is a decimal number up to 32 bits. An unknown symbol is 404 not_found; an unknown id is not checked against the registry and answers with an empty list, so a client can follow a coin id that the registry has not picked up yet. The holders endpoint checks both and answers 404 for an unknown id.

GET /v1/coins/{symbol|id}/candles

OHLCV candles of one coin against a quote coin.

Query parameters:

ParameterDefaultLimitsMeaning
interval1h1m, 5m, 15m, 1h, 4h, 1dcandle width
fromto − 300 × intervalUnix secondsstart; floored to the interval
tonowUnix secondsend; the candle holding to is included
quoteBIPBIP or USDquote coin

to is expanded to the end of the candle that contains it: that candle is included, and to in the answer is the next interval boundary. from must be before to, and the window may hold at most 1000 candles. quote=BIP is a bad request for BIP itself; quote=USD is a bad request for one of the server's USD stablecoins. USD quotes use the server's configured set of USD stablecoins.

With quote=BIP, a coin with no direct BIP trades is repriced through its non-BIP counter coin's latest BIP price (no older than 24 h and not after the trade); source.trades_without_bip_price then counts the trades that could not be priced. With direct BIP trades the answer is unchanged and that field is absent.

curl 'https://api.denebnav.app/v1/coins/symbol/ONY/candles?interval=1h&quote=BIP&from=1792454400&to=1792458000'
{
  "coin": { "id": 4404, "symbol": "ONY" },
  "quote": "BIP",
  "interval": "1h",
  "from": 1792454400,
  "to": 1792461600,
  "candles": [
    {
      "time": 1792454400,
      "open": "0.000110000000000000",
      "high": "0.000112500000000000",
      "low": "0.000109800000000000",
      "close": "0.000111400000000000",
      "volume": "1250.000000000000000000",
      "quote_volume": "0.137600000000000000",
      "trades": 7
    }
  ],
  "source": {
    "index": "trade:39800000",
    "history_from": "2026-09-01T00:00:00Z",
    "updated_at": "2026-10-20T08:18:49Z"
  }
}
FieldTypeMeaning
coinobject{id, symbol} of the coin; symbol is empty when the server does not know the id
quotestringBIP or USD
intervalstringcandle width
from / tonumberthe window in Unix seconds, aligned to the interval
candles[].timenumbercandle start, Unix seconds
candles[].open / .high / .low / .closestringprice in the quote coin per 1 coin, decimal strings
candles[].volumestringvolume in the coin, decimal string
candles[].quote_volumestringvolume in the quote coin, decimal string
candles[].tradesnumbertrades in the candle
source.indexstringidentifier of the trade index (absent before it is built)
source.history_fromstringtime of the first indexed block; there are no trades before it
source.updated_atstringtime of the last block read
source.notestringtrades are not indexed yet while the index is empty
source.trades_without_bip_pricenumbertrades the BIP fallback could not price (omitted when zero)

Intervals without trades have no candle at all — do not expect a fixed number of candles for a window.

400 bad_request for a bad interval, range, from/to, quote or parameter name; 404 not_found for an unknown symbol; 503 unavailable when trade data is not configured or not available.

Cache-Control: public, max-age=10.

GET /v1/coins/{symbol|id}/trades

The trade feed of one coin, newest first. Each row is one leg of a swap or a reserve exchange.

Query parameters:

ParameterDefaultLimitsMeaning
limit501..100rows per page
before—cursor from nextreturn rows strictly before this leg

The cursor has the form <block>.<transaction>.<leg>, e.g. 42105550.12.0. next is present only when the page was full; pass it as before to get the next (older) page.

curl 'https://api.denebnav.app/v1/coins/id/4404/trades?limit=1'
{
  "coin": { "id": 4404, "symbol": "ONY" },
  "trades": [
    {
      "time": 1792457980,
      "height": 42105550,
      "hash": "Mt0000000000000000000000000000000000000000000000000000000000000001",
      "trader": "Mx0000000000000000000000000000000000000003",
      "side": "buy",
      "via": "pool",
      "pool_id": 1825,
      "amount": "250.000000000000000000",
      "counter_coin": { "id": 0, "symbol": "BIP" },
      "counter_amount": "0.027500000000000000",
      "price": "0.000110000000000000",
      "hop": 0,
      "hops": 1
    }
  ],
  "next": "42105550.12.0",
  "source": {
    "index": "trade:39800000",
    "history_from": "2026-09-01T00:00:00Z",
    "updated_at": "2026-10-20T08:18:49Z"
  }
}
FieldTypeMeaning
coinobject{id, symbol} of the page's coin
trades[].timenumberblock time, Unix seconds
trades[].heightnumberblock height
trades[].hashstringtransaction hash, Mt + 64 hex
trades[].traderstringsender address, Mx + 40 hex
trades[].sidestringbuy — the trader received the coin, sell — gave it
trades[].viastringpool or reserve
trades[].pool_idnumber \nullpool id; null for a reserve exchange
trades[].amountstringamount of the page's coin, decimal string
trades[].counter_coinobjectthe other coin, {id, symbol}
trades[].counter_amountstringamount of the counter coin, decimal string
trades[].pricestringcounter coin per 1 of the page's coin, decimal string
trades[].hopnumber0-based step of the swap route
trades[].hopsnumbernumber of steps in the transaction
nextstringcursor for the next page; absent when the page was not full
sourceobjectas for candles; note is trades are not indexed yet while empty

400 bad_request for a bad limit, before or path coin; 404 not_found for an unknown symbol; 503 unavailable when trade data is not configured or not available.

Cache-Control: public, max-age=10.

GET /v1/coins/{symbol|id}/holders

The top holders of one coin: free balance plus active stake per address.

Query parameters:

ParameterDefaultLimitsMeaning
limit201..100addresses in top

Unlike candles and trades, an unknown coin id is 404 not_found here, and only limit is accepted as a query parameter.

curl 'https://api.denebnav.app/v1/coins/symbol/ONY/holders?limit=2'
{
  "coin": { "id": 4404, "symbol": "ONY" },
  "holders_count": 1834,
  "top": [
    {
      "address": "Mx0000000000000000000000000000000000000004",
      "balance": "12000000.000000000000000000",
      "stake": "500000.000000000000000000",
      "total": "12500000.000000000000000000",
      "share": "0.3125"
    },
    {
      "address": "Mx0000000000000000000000000000000000000005",
      "balance": "8000000.000000000000000000",
      "stake": "0.000000000000000000",
      "total": "8000000.000000000000000000",
      "share": "0.2000"
    }
  ],
  "top10_share": "0.7340",
  "source": {
    "index": "holders:42105677",
    "updated_at": "2026-10-20T08:18:45Z"
  }
}
FieldTypeMeaning
coinobject{id, symbol} of the coin
holders_countnumberaddresses with a positive total (balance + active stake)
top[]arraythe largest holders, total descending, ties by address
top[].addressstringholder address, Mx + 40 hex
top[].balancestringfree balance, decimal string
top[].stakestringactive stake, decimal string
top[].totalstringbalance + stake, decimal string
top[].sharestringshare of the sum of all totals, 4 fractional digits
top10_sharestringshare of the first ten holders (fewer when there are fewer), 4 fractional digits
source.indexstringidentifier of the index snapshot
source.updated_atstringhead block time of that snapshot, RFC 3339 UTC

Kicked stakes are not counted. share and top10_share are strings such as "0.3125", not numbers.

400 bad_request for a bad limit, unknown parameter or path coin; 404 not_found for an unknown coin; 503 unavailable when holders data is not configured or not available.

Cache-Control: public, max-age=60.

Prices

GET /v1/prices/series

The sampled BIP price over the last 24 hours, one point per few blocks.

Query parameters (both required):

ParameterLimitsMeaning
pairBIP-USDTE or BIP-USDTBSCwhich stablecoin the BIP price is taken from
window24honly the 24 hour window is available

Points are sampled every few blocks (one sample per 12 blocks by default) and kept in memory for a little over 24 hours; the service starts with an empty series after a restart. Points are oldest first, and only those inside the window are returned. price is USD per 1 BIP.

curl 'https://api.denebnav.app/v1/prices/series?pair=BIP-USDTE&window=24h'
{
  "data": {
    "pair": "BIP-USDTE",
    "window": "24h",
    "points": [
      { "height": 42105666, "time": "2026-10-20T08:17:49Z", "price": "0.031150000000000000" },
      { "height": 42105678, "time": "2026-10-20T08:18:49Z", "price": "0.031200000000000000" }
    ]
  },
  "source": {
    "height": 42105678,
    "time": "2026-10-20T08:18:49Z",
    "parts": { "price_series": "pools" },
    "stale": []
  }
}
FieldTypeMeaning
data.pairstringthe requested pair
data.windowstring24h
data.points[]arraysampled points, oldest first
data.points[].heightnumberblock height of the sample
data.points[].timestringblock time, RFC 3339 UTC
data.points[].pricestringUSD per 1 BIP, decimal string

A missing or unknown pair, or any window other than 24h, is 400 bad_request. source.stale contains price_series when the last valuation refresh failed; source.parts.price_series is pools when it succeeded.

Cache-Control: public, max-age=5.