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 orbigint, neverNumber.Prices are decimal strings too. A coin's
price_bip/price_usdis 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. Orderpriceis 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 insource.time/source.updated_at. The coin market endpoints are the exception: candle and tradetime, and the candlefrom/to, are Unix seconds.Identifiers: an address is
Mx+ 40 hex, a transaction hashMt+ 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}/ordersand/v1/orders:page(1-based, up to
and
limit(default 50, max 150); the answer is{data, links, meta}withmeta.current_page,meta.last_page,meta.per_page,meta.total.links.next/links.prevarenullat the ends.
Cursor —
/v1/coins/…/trades: passbefore(the value ofnextfrom the previous page) to walk older trades.Window —
/v1/coins/…/candlestakesfrom/toin Unix seconds;/v1/pools/orders/{id},/v1/coins,/v1/pools/coins/{a}/{b}and/v1/prices/seriesare not paged.Errors have one shape,
{"error": {"code": "...", "message": "..."}}, withCache-Control: no-store. Themessageis for developers; pick UI text bycode. 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 is429from the rate limiter: the proxy answers it without a JSON body (see Access).Caching:
Cache-Control: public, max-age=5for coins, pools, orders and the price series;public, max-age=10for candles and trades;public, max-age=60for holders. Errors areno-store.sourceobject. Coins, pools, orders and the price series carry the standardsource: 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 namestrade_volume_bip_1dandtrade_volume_bip_30d),stale(groups whose last refresh failed and are served older), and optionalcoverage(completeness of a volume window),noteandprice.priceis present on coin and pool answers: the BIP/USD valuation —height,method(liquidity_weighted_stable_pools),min_stable_usd, andpools[]withid,coin({id, symbol}),bip_reserve,stable_reserve,bip_price_usd,weight, and optionalexcluded+reason(a pool left out of the valuation). It is omitted from the short examples below. Acoverageentry haswindow,from,complete, and, when the window is complete,complete_from_heightandcomplete_from_time. The coin market endpoints (candles, trades, holders) carry a smallersourceinstead:index,history_from,updated_at, and sometimesnoteortrades_without_bip_price— see each endpoint. Ignoresourcein 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": []
}
}| Field | Type | Meaning | |
|---|---|---|---|
id | number | coin id; 0 is BIP | |
crr | number | constant reserve ratio, percent; 100 for BIP | |
volume | string | current supply, decimal string; for BIP, the current emission | |
reserve_balance | string | reserve in BIP, decimal string | |
max_supply | string | maximum supply, decimal string | |
name | string | display name; BIP is Base coin | |
symbol | string | ticker | |
owner_address | string \ | null | coin owner, null when there is none |
burnable | boolean | the coin can be burned | |
mintable | boolean | the coin can be minted | |
type | string | coin (bonded), token or pool_token | |
trading_volume_24h | string | 24 h trading volume valued in BIP, decimal string | |
trading_volume_1mo | string | 30 day trading volume valued in BIP, decimal string | |
price_usd | string | coin price in USD, decimal string | |
price_bip | string | coin price in BIP, decimal string | |
price_method | string | how 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/4404The 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/ONYThe 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:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
coin | — | symbol or numeric id | only pools that contain this coin; 404 when it is unknown |
page | 1 | 1..100000 | 1-based page |
limit | 50 | 1..150 | pools 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
}
}
}
}| Field | Type | Meaning |
|---|---|---|
id | number | pool id |
coin0 / coin1 | object | the two pool coins, {id, symbol} |
token | object | the LP token; {id: 0, symbol: "LP-<pool id>"} when the LP coin is not in the registry |
amount0 / amount1 | string | pool reserves of coin0 / coin1, decimal strings |
liquidity | string | pool liquidity as the node reports it, decimal string |
liquidity_bip | string | liquidity valued in BIP, decimal string; the sort key |
trade_volume_bip_1d | string | 24 h trading volume valued in BIP, decimal string |
trade_volume_bip_30d | string | 30 day trading volume valued in BIP, decimal string |
updated_at_block | number | block height the pool snapshot was read at |
open_orders | number | open 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:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
status | — | active, partially_filled, filled, canceled, expired | filter by status; empty means open orders only |
page | 1 | 1..100000 | 1-based page |
limit | 50 | 1..150 | orders 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": []
}
}| Field | Type | Meaning |
|---|---|---|
id | number | order id |
address | string | owner address |
pool_id | number | pool the order belongs to |
initial_coin_to_buy_volume | string | amount to buy when the order was created, decimal string |
coin_to_buy_volume | string | amount still to buy, decimal string |
initial_coin_to_sell_volume | string | amount to sell when the order was created, decimal string |
coin_to_sell_volume | string | amount still to sell, decimal string |
coin_to_sell / coin_to_buy | object | {id, symbol} of the two coins |
height | number | block height the order was created at |
status | string | active or partially_filled (open); a history status when it is not open |
price | string | limit 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:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
status | — | active, partially_filled, filled, canceled, expired | filter by status; empty means open orders only |
page | 1 | 1..100000 | 1-based page |
limit | 50 | 1..150 | orders 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:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
interval | 1h | 1m, 5m, 15m, 1h, 4h, 1d | candle width |
from | to − 300 × interval | Unix seconds | start; floored to the interval |
to | now | Unix seconds | end; the candle holding to is included |
quote | BIP | BIP or USD | quote 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"e=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"
}
}| Field | Type | Meaning |
|---|---|---|
coin | object | {id, symbol} of the coin; symbol is empty when the server does not know the id |
quote | string | BIP or USD |
interval | string | candle width |
from / to | number | the window in Unix seconds, aligned to the interval |
candles[].time | number | candle start, Unix seconds |
candles[].open / .high / .low / .close | string | price in the quote coin per 1 coin, decimal strings |
candles[].volume | string | volume in the coin, decimal string |
candles[].quote_volume | string | volume in the quote coin, decimal string |
candles[].trades | number | trades in the candle |
source.index | string | identifier of the trade index (absent before it is built) |
source.history_from | string | time of the first indexed block; there are no trades before it |
source.updated_at | string | time of the last block read |
source.note | string | trades are not indexed yet while the index is empty |
source.trades_without_bip_price | number | trades 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:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
limit | 50 | 1..100 | rows per page |
before | — | cursor from next | return 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"
}
}| Field | Type | Meaning | |
|---|---|---|---|
coin | object | {id, symbol} of the page's coin | |
trades[].time | number | block time, Unix seconds | |
trades[].height | number | block height | |
trades[].hash | string | transaction hash, Mt + 64 hex | |
trades[].trader | string | sender address, Mx + 40 hex | |
trades[].side | string | buy — the trader received the coin, sell — gave it | |
trades[].via | string | pool or reserve | |
trades[].pool_id | number \ | null | pool id; null for a reserve exchange |
trades[].amount | string | amount of the page's coin, decimal string | |
trades[].counter_coin | object | the other coin, {id, symbol} | |
trades[].counter_amount | string | amount of the counter coin, decimal string | |
trades[].price | string | counter coin per 1 of the page's coin, decimal string | |
trades[].hop | number | 0-based step of the swap route | |
trades[].hops | number | number of steps in the transaction | |
next | string | cursor for the next page; absent when the page was not full | |
source | object | as 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:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
limit | 20 | 1..100 | addresses 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"
}
}| Field | Type | Meaning |
|---|---|---|
coin | object | {id, symbol} of the coin |
holders_count | number | addresses with a positive total (balance + active stake) |
top[] | array | the largest holders, total descending, ties by address |
top[].address | string | holder address, Mx + 40 hex |
top[].balance | string | free balance, decimal string |
top[].stake | string | active stake, decimal string |
top[].total | string | balance + stake, decimal string |
top[].share | string | share of the sum of all totals, 4 fractional digits |
top10_share | string | share of the first ten holders (fewer when there are fewer), 4 fractional digits |
source.index | string | identifier of the index snapshot |
source.updated_at | string | head 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):
| Parameter | Limits | Meaning |
|---|---|---|
pair | BIP-USDTE or BIP-USDTBSC | which stablecoin the BIP price is taken from |
window | 24h | only 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": []
}
}| Field | Type | Meaning |
|---|---|---|
data.pair | string | the requested pair |
data.window | string | 24h |
data.points[] | array | sampled points, oldest first |
data.points[].height | number | block height of the sample |
data.points[].time | string | block time, RFC 3339 UTC |
data.points[].price | string | USD 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.