Deneb REST API v1 — chain data
Public read-only REST API of the Deneb network. It serves network status, addresses, transactions and validators from our own node's current state. Everything 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. The only JSON-number fields are display values such asbip_price_usd,market_cap,avg_block_timeandtransactions_per_second.Block height is a JSON number. Time is RFC 3339 in UTC (
"2026-10-20T08:18:49Z").Identifiers: an address is
Mx+ 40 hex, a validator public keyMp+ 64 hex, a transaction hashMt+ 64 hex, a block hashMh+ 64 hex.Pagination (only where a list is paged):
/v1/validators/{pk}/stakes— explorer-style:page(1-based, up to 100000) andlimit(default 50, max 150); the answer is{data, links, meta}withmeta.current_page,meta.last_page,meta.per_page,meta.total./v1/transactions— a cursor over blocks: passbefore_height(the value ofmeta.next_before_height) to walk history;pageis always 1.Errors have one shape,
{"error": {"code": "...", "message": "..."}}, andCache-Control: no-store. Themessageis for developers; pick UI text bycode. Common codes:bad_request(400),not_found(404),unavailable(503),upstream(502),internal(500).Caching: successful answers from the node come with
Cache-Control: public, max-age=5./v1/healthisno-store./v1/analytics/*ispublic, max-age=3600for a fully closed range andpublic, max-age=60while the range still includes a partial day.sourceobject. Every answer except/v1/healthcarriessource: 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","explorer-api"),stale(groups whose last refresh failed and are served older), and optionalcoverage,priceandnote. Ignore it 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. 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.
Endpoints
GET /v1/health
Service and node readiness.
No parameters.
curl https://api.denebnav.app/v1/health{
"ok": true,
"version": "0.1.0",
"uptime_s": 91234,
"head": { "height": 42105678, "time": "2026-10-20T08:18:49Z" },
"registry": { "ready": true, "coins": 4021, "swept_height": 42105678, "swept_at": "2026-10-20T08:18:45Z" }
}| Field | Type | Meaning |
|---|---|---|
ok | boolean | the node's head was read without error |
version | string | service version |
uptime_s | number | seconds since the service started |
head.height | number | chain head height |
head.time | string | head block time, RFC 3339 UTC |
registry.ready | boolean | the coin registry is loaded |
registry.coins | number | coins in the registry |
registry.swept_height | number | height the registry was last swept to |
registry.swept_at | string | time of that sweep, RFC 3339 UTC |
error | string | present only when the node is unreachable |
When the node head cannot be read the status is 503 and the body is the same object with "ok": false and an error string. Cache-Control: no-store.
GET /v1/status
Network status: the head, BIP/USD price, market cap and throughput.
curl https://api.denebnav.app/v1/status{
"data": {
"avg_block_time": 5.02,
"bip_price_change": 1.24,
"bip_price_usd": 0.0312,
"latest_block_height": 42105678,
"latest_block_time": "2026-10-20T08:18:49Z",
"market_cap": 312000000,
"total_transactions": 87213456,
"transactions_per_second": 0.11,
"current_emission": "89558.137234329718283132"
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
avg_block_time | number | average block time, seconds | |
bip_price_change | number \ | null | BIP/USD change over 24 h, percent |
bip_price_usd | number | current BIP/USD price | |
latest_block_height | number | head height | |
latest_block_time | string | head block time, RFC 3339 UTC | |
market_cap | number | BIP price × current emission, USD | |
total_transactions | number \ | null | total transactions, from explorer-api |
transactions_per_second | number | rolling daily TPS, from explorer-api | |
current_emission | string | emitted BIP so far, decimal string (18 digits) | |
legacy | object \ | null | explorer-api's view of the same numbers, kept for comparison |
Cache-Control: public, max-age=5.
GET /v1/addresses/{addr}
Balances and the stake summary of one address.
Path parameter addr: Mx + 40 hex (the hex part is case-insensitive). Query parameter min_height (optional): a block height 1 or more. The answer is rebuilt to be at least that fresh — useful right after the wallet saw its own transaction in block N. At most head + 2, otherwise 400.
curl 'https://api.denebnav.app/v1/addresses/Mx0000000000000000000000000000000000000001?min_height=40000000'{
"data": {
"address": "mx0000000000000000000000000000000000000001",
"balances": [
{
"coin": { "id": 0, "symbol": "BIP", "type": "coin" },
"amount": "2380.721002496072294651",
"bip_amount": "2380.721002496072294651",
"valuation": "base"
}
],
"total_balance_sum": "2380.721002496072294651",
"total_balance_sum_usd": "74.278495277886",
"stake_balance_sum": "0.000000000000000000",
"stake_balance_sum_usd": "0",
"stake_delegated_sum": "0.000000000000000000",
"stake_waitlisted_sum": "0.000000000000000000",
"stake_weight_sum": "0.000000000000000000",
"transaction_count": 42,
"locked_stake_until_block": null
},
"latest_block_time": "2026-10-20T08:18:49Z",
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
address | string | the address, lower-case hex | |
balances[].coin | object | {id, symbol, type}; type is coin, token or pool_token | |
balances[].amount | string | balance of that coin, decimal string | |
balances[].bip_amount | string | its BIP value, decimal string | |
balances[].valuation | string | how bip_amount was computed: base, node_sell, pool, curve, route, lp or none | |
total_balance_sum | string | sum of all bip_amount, decimal string | |
total_balance_sum_usd | string | that sum in USD, decimal string | |
stake_balance_sum | string | total stake (delegated + waitlisted), decimal string | |
stake_balance_sum_usd | string | that stake in USD, decimal string | |
stake_delegated_sum | string | delegated stake, decimal string | |
stake_waitlisted_sum | string | waitlisted stake, decimal string | |
stake_weight_sum | string | network stake weight (delegate_bip_value), decimal string | |
transaction_count | number | transactions sent from this address | |
locked_stake_until_block | number \ | null | end block of an address-wide stake lock, if any |
Cache-Control: public, max-age=5; with min_height it is no-store (the client re-asks until source.height reaches N).
GET /v1/addresses/{addr}/delegations
The address's stake per validator, waitlisted stake and unbonding (releasing) stake.
Path parameter addr: as above.
curl 'https://api.denebnav.app/v1/addresses/Mx0000000000000000000000000000000000000001/delegations'{
"data": [
{
"coin": { "id": 0, "symbol": "BIP" },
"value": "5000.000000000000000000",
"bip_value": "5000.000000000000000000",
"validator": {
"public_key": "mp0000000000000000000000000000000000000000000000000000000000000000",
"name": null,
"description": null,
"icon_url": "",
"site_url": null,
"status": 2,
"commission": 10
},
"is_waitlisted": false,
"stake_weight_bip": "5000.000000000000000000"
}
],
"meta": {
"additional": {
"total_delegated_bip_value": "5000.000000000000000000",
"total_waitlisted_bip_value": "0.000000000000000000",
"total_stake_weight_bip": "5000.000000000000000000",
"locked_data": null,
"unbonding": []
}
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
data[].coin | object | {id, symbol} of the staked coin | |
data[].value | string | staked amount, decimal string | |
data[].bip_value | string | its BIP value, decimal string | |
data[].validator | object | validator metadata, see the validators section | |
data[].is_waitlisted | boolean | the stake is still waitlisted | |
data[].stake_weight_bip | string | network stake weight of this stake, decimal string | |
meta.additional.total_delegated_bip_value | string | total delegated, decimal string | |
meta.additional.total_waitlisted_bip_value | string | total waitlisted, decimal string | |
meta.additional.total_stake_weight_bip | string | total stake weight, decimal string | |
meta.additional.locked_data | object \ | null | {end_block} of an address-wide stake lock |
meta.additional.unbonding[] | array | stakes being released: height, validator, coin, value, move_to_public_key |
Cache-Control: public, max-age=5 (with min_height it is no-store).
GET /v1/transactions
Network transactions, newest first. Without before_height it is the latest-transactions feed; with it, a page of history from blocks strictly below that height.
Query parameters:
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
limit | 25 | 1..50 | transactions per page |
before_height | — | ≥ 1 | start of the next page (pass meta.next_before_height) |
page | 1 | only 1 | always 1; use before_height for older transactions |
curl 'https://api.denebnav.app/v1/transactions?limit=2'{
"data": [
{
"txn": 0,
"hash": "mt0000000000000000000000000000000000000000000000000000000000000000",
"nonce": 12,
"height": 42105678,
"timestamp": "2026-10-20T08:18:49Z",
"type": 1,
"payload": "",
"from": "mx0000000000000000000000000000000000000001",
"data": { "coin": { "id": 0, "symbol": "BIP" }, "to": "mx0000000000000000000000000000000000000002", "value": "100.000000000000000000" },
"gas": "1",
"gas_price": 1,
"gas_coin": { "id": 0, "symbol": "BIP" },
"fee": "0.010000000000000000",
"commission_in_base_coin": "0.010000000000000000",
"commission_in_gas_coin": "0.010000000000000000",
"commission_price": "0.010000000000000000",
"commission_price_coin": { "id": 0, "symbol": "BIP" },
"raw_tx": "f8..."
}
],
"links": { "first": "/v1/transactions?limit=2&page=1", "last": "/v1/transactions?limit=2&page=1", "prev": null, "next": "/v1/transactions?limit=2&before_height=42105677" },
"meta": {
"current_page": 1,
"last_page": 1,
"path": "/v1/transactions",
"per_page": 2,
"total": 2,
"next_before_height": 42105677
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
txn | number | explorer sequence number; always 0 here (the node does not know it) | |
hash | string | transaction hash, Mt + 64 hex | |
nonce | number | sender nonce | |
height | number | block height | |
timestamp | string | block time, RFC 3339 UTC | |
type | number | transaction type id (1 Send … 38 Lock) | |
payload | string | base64-encoded payload, empty if none | |
from | string | sender address | |
data | object | type-specific payload; coin ids numeric, amounts decimal strings | |
gas | string | gas units, numeric string | |
gas_price | number | gas price | |
gas_coin | object | {id, symbol} of the coin the fee is paid in | |
fee | string | fee, decimal string | |
commission_in_base_coin | string | fee in BIP, decimal string | |
commission_in_gas_coin | string | fee in the gas coin, decimal string | |
commission_price | string | fee in the price coin, decimal string | |
commission_price_coin | object | {id, symbol} of the price coin | |
raw_tx | string | RLP-encoded signed transaction, hex | |
meta.next_before_height | number \ | null | before_height of the next page; null = start of the node's history |
Pages are block-aligned, so a page can be shorter than limit and still have a next page, and one page can repeat a few transactions from the previous one — deduplicate by hash. Cache-Control: public, max-age=5.
GET /v1/validators
All validators and candidates, sorted by stake, highest first.
curl 'https://api.denebnav.app/v1/validators'{
"data": [
{
"public_key": "mp0000000000000000000000000000000000000000000000000000000000000000",
"name": "Validator One",
"description": null,
"icon_url": "",
"site_url": null,
"status": 2,
"commission": 10,
"stake": "5000000.000000000000000000",
"part": "31.86067233",
"delegator_count": 128,
"min_stake": "100.000000000000000000",
"reward_address": "mx0000000000000000000000000000000000000001",
"owner_address": "mx0000000000000000000000000000000000000001",
"control_address": "mx0000000000000000000000000000000000000001",
"uniq_users": 128,
"used_slots": 12,
"jailed_until": 0,
"in_active_set": true
}
],
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
public_key | string | validator public key, Mp + 64 hex | |
name | string \ | null | display name |
description | string \ | null | description |
icon_url | string | icon URL | |
site_url | string \ | null | website |
status | number | 1 = offline, 2 = online | |
commission | number | commission, percent (0–100) | |
stake | string | total stake, decimal string | |
part | string | share of the online stake, percent as a decimal string | |
delegator_count | number | number of delegators | |
min_stake | string | minimum stake, decimal string | |
reward_address | string | reward address | |
owner_address | string | owner address | |
control_address | string | control address | |
uniq_users | number | unique delegators | |
used_slots | number | used slots | |
jailed_until | number | block height until which the validator is jailed | |
in_active_set | boolean | in the active set |
Cache-Control: public, max-age=5.
GET /v1/validators/{pk}
One validator. Path parameter pk: Mp + 64 hex (the hex part is case-insensitive). 404 not_found if unknown.
curl 'https://api.denebnav.app/v1/validators/Mp0000000000000000000000000000000000000000000000000000000000000000'The data object has exactly the same fields as a row of GET /v1/validators. Cache-Control: public, max-age=5.
GET /v1/validators/{pk}/stakes
The stakes held at one validator, paged. Path parameter pk as above; 404 not_found if unknown. Query parameters page (1-based, up to 100000) and limit (default 50, max 150).
curl 'https://api.denebnav.app/v1/validators/Mp0000000000000000000000000000000000000000000000000000000000000000/stakes?limit=2'{
"data": [
{
"coin": { "id": 0, "symbol": "BIP" },
"address": "mx0000000000000000000000000000000000000001",
"value": "5000.000000000000000000",
"bip_value": "5000.000000000000000000",
"is_waitlisted": false
}
],
"links": { "first": "/v1/validators/mp.../stakes?page=1", "last": "/v1/validators/mp.../stakes?page=3", "prev": null, "next": "/v1/validators/mp.../stakes?page=2" },
"meta": { "current_page": 1, "last_page": 3, "path": "/v1/validators/mp.../stakes", "per_page": 2, "total": 6 },
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning |
|---|---|---|
data[].coin | object | {id, symbol} of the staked coin |
data[].address | string | the delegator's address |
data[].value | string | staked amount, decimal string |
data[].bip_value | string | its BIP value, decimal string |
data[].is_waitlisted | boolean | the stake is still waitlisted |
Cache-Control: public, max-age=5.
GET /v1/stats
One request for the whole Statistics page: network summary, BIP/USD, validators, pools, coin counts and the daily transaction history.
curl 'https://api.denebnav.app/v1/stats'{
"data": {
"network": {
"height": 42105678,
"avg_block_time": 5.02,
"tps": 0.11,
"total_transactions": 87213456,
"current_emission": "89558.137234329718283132",
"emission_max": "10000000000.000000000000000000"
},
"bip": { "price_usd": 0.0312, "change_24h": 1.24, "market_cap": 312000000 },
"validators": {
"active_count": 64,
"total_stake": "120000000.000000000000000000",
"top10": [
{ "public_key": "mp...", "name": "Validator One", "icon": "", "stake": "5000000.000000000000000000", "share": 31.86 }
]
},
"pools": {
"count": 120,
"volume_24h_bip": "1250000.000000000000000000",
"volume_24h_usd": "39000",
"top10": [
{ "pool_id": 1, "coin0": { "id": 0, "symbol": "BIP" }, "coin1": { "id": 1902, "symbol": "HUB" }, "volume_24h_bip": "500000.000000000000000000" }
]
},
"coins": { "coins": 200, "tokens": 3800, "lp": 120, "total": 4120 },
"tx_daily": {
"history_from": "2021-04-01",
"days": [ { "date": "2026-10-19", "transaction_count": 12040 } ]
}
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": {}, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
network.height | number | head height | |
network.avg_block_time | number | average block time, seconds | |
network.tps | number | rolling daily TPS | |
network.total_transactions | number | total transactions | |
network.current_emission | string | emitted BIP so far, decimal string | |
network.emission_max | string | protocol maximum, 10 000 000 000 BIP, decimal string | |
bip.price_usd | number | current BIP/USD price | |
bip.change_24h | number \ | null | 24 h change, percent |
bip.market_cap | number | BIP price × current emission, USD | |
validators.active_count | number | size of the active set | |
validators.total_stake | string | total stake of the active set, decimal string | |
validators.top10[].public_key | string | validator public key | |
validators.top10[].name | string \ | null | display name |
validators.top10[].icon | string | icon URL | |
validators.top10[].stake | string | stake, decimal string | |
validators.top10[].share | number | percent of the active set's stake | |
pools.count | number | number of pools | |
pools.volume_24h_bip | string | 24 h swap volume in BIP, decimal string | |
pools.volume_24h_usd | string | 24 h swap volume in USD, decimal string | |
pools.top10[].pool_id | number | pool id | |
pools.top10[].coin0 / .coin1 | object | {id, symbol} of the pool's coins | |
pools.top10[].volume_24h_bip | string | that pool's 24 h volume, decimal string | |
coins.coins | number | bonding-curve coins in the registry | |
coins.tokens | number | tokens in the registry | |
coins.lp | number | pool (LP) tokens in the registry | |
coins.total | number | total coins in the registry | |
tx_daily.history_from | string | first date of the daily history, YYYY-MM-DD | |
tx_daily.days[] | array | {date, transaction_count} per day |
Cache-Control: public, max-age=5.
GET /v1/analytics/{metric}
One daily or monthly analytics series (ADR 0033). Path parameter metric is one of the names below.
Query parameters:
| Parameter | Default | Limits | Meaning | |
|---|---|---|---|---|
bucket | day | day \ | month | point granularity |
from | to − 89 days (days) or the history start (months) | YYYY-MM-DD | first day of the range | |
to | today (UTC) | YYYY-MM-DD | last day of the range |
from must not be after to; the range is at most 400 days or 240 months.
curl 'https://api.denebnav.app/v1/analytics/fees?bucket=month&from=2026-01-01&to=2026-10-01'{
"metric": "fees",
"agg": "sum",
"unit": "BIP",
"bucket": "month",
"from": "2026-01-01",
"to": "2026-10-31",
"points": [
["2026-01", "102.250000000000000000"],
["2026-02", "98.000000000000000000"]
],
"source": { "index": "postgres:1000…", "history_from": "2026-01-01", "partial_from": "2026-10-20", "updated_at": "2026-10-20T08:18:49Z" }
}| Field | Type | Meaning | |
|---|---|---|---|
metric | string | the metric name | |
agg | string | sum, avg or last | |
unit | string | value unit: addresses, tx, BIP, %, coins, … | |
bucket | string | day or month | |
keys | array \ | — | names of the vector components, for vector metrics |
from / to | string | the range, YYYY-MM-DD | |
points | array | [date, value] pairs; a day is YYYY-MM-DD, a month its first day YYYY-MM-01 | |
source.index | string | identifier of the rollup database | |
source.history_from | string | first day of the history | |
source.partial_from | string | first day that is not complete yet | |
source.updated_at | string | last write, RFC 3339 UTC |
Metrics (a value is an integer, a vector of integers, a BIP amount as a decimal string, or a percent with 2 decimals):
| metric | agg | unit | value |
|---|---|---|---|
active_addresses | avg | addresses | integer |
new_addresses | sum | addresses | integer |
tx_by_type | sum | tx | vector [transfer, swap, stake, liquidity, other] |
fees | sum | BIP | decimal string |
swap_volume | sum | BIP | decimal string |
stake_share | last | % | number with 2 decimals |
delegators | last | delegators | integer |
nakamoto | last | validators | integer |
new_coins | sum | coins | vector [coin, token] |
bridge_flows and market_cap are not computed yet and answer 404 not_available. Unknown metric — 404 not_found. A wrong parameter — 400 bad_request. Cache-Control: public, max-age=3600 when the range is fully closed, public, max-age=60 while it includes a partial day.
Estimates
Read-only quotes from the node: what a swap would give or cost, what a transaction would cost in commission, and the current network fee table. Nothing here signs or sends a transaction. Amounts in the request are decimal coin units ("100", "0.5"), amounts in the answer are decimal strings with 18 fractional digits.
GET /v1/estimate/swap
One swap quote. Coins may be given by symbol or numeric id; a router that has not built the transaction yet uses this to choose the path.
| Parameter | Required | Meaning |
|---|---|---|
coin_to_sell | yes | coin to sell: symbol (BIP, USDTE) or id (0, 1993) |
coin_to_buy | yes | coin to buy: symbol or id |
value_to_sell | one of | exact amount to sell, positive decimal |
value_to_buy | one of | exact amount to buy, positive decimal |
swap_from | no | optimal (default), pool or bancor |
route | no | intermediate coins, repeated (route=1993&route=3494) or comma-separated (route=1993,3494); at most 3. Empty — direct pool or the coin's reserve |
Exactly one of value_to_sell / value_to_buy is required. swap_from=optimal lets the node compare the pool path with the coin's reserve (bancor) and answer which one it used. The node does not search routes: route is what the caller asked for, and the answer repeats it.
curl 'https://api.denebnav.app/v1/estimate/swap?coin_to_sell=BIP&coin_to_buy=USDTE&value_to_sell=100&swap_from=optimal'{
"data": {
"coin_to_sell": { "id": 0, "symbol": "BIP" },
"coin_to_buy": { "id": 1993, "symbol": "USDTE" },
"value_to_sell": "100.000000000000000000",
"will_get": "0.008596965612352558",
"commission": "346.833116928590165264",
"commission_coin": { "id": 0, "symbol": "BIP" },
"swap_from": "pool",
"route": []
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": { "estimate": "node" }, "stale": [] }
}| Field | Type | Meaning |
|---|---|---|
coin_to_sell / coin_to_buy | object | {id, symbol} of the pair |
value_to_sell + will_get | string | sell quote: amount sold and amount the swap yields |
value_to_buy + will_pay | string | buy quote: amount wanted and amount it costs |
commission | string | network commission of the swap transaction, in commission_coin |
commission_coin | object | coin the commission is charged in (BIP) |
swap_from | string | pool or bancor: where the node found the price |
route | array | intermediate coins ({id, symbol}), in the order asked; empty for a direct swap |
A valid request for a pair the node cannot exchange by this path is 404 not_found (no route). An unknown coin is 404; a malformed or contradictory request (both value parameters, a non-positive amount, more than 3 hops, swap_from outside the list, equal coins) is 400 bad_request. Cache-Control: public, max-age=5.
GET /v1/estimate/tx-commission
The commission the node would charge for a prepared transaction — signed or unsigned — priced at the current state. Useful to show an exact fee before signing and to compare it with the fee table.
| Parameter | Required | Meaning |
|---|---|---|
tx | yes | raw transaction hex, with or without 0x |
gas_coin | no | the transaction's gas coin: symbol or id, default BIP. The API does not decode the raw transaction, so it cannot read the gas coin itself; name it here to get the BIP value |
TX=0xf8… # your prepared transaction, raw hex
curl "https://api.denebnav.app/v1/estimate/tx-commission?tx=$TX"{
"data": {
"commission": "139.046831617890511004",
"gas_coin": { "id": 0, "symbol": "BIP" },
"commission_bip": "139.046831617890511004"
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": { "commission": "node" }, "stale": [] }
}| Field | Type | Meaning | |
|---|---|---|---|
commission | string | commission in gas_coin | |
gas_coin | object | gas coin of the transaction | |
commission_bip | string \ | null | the same commission in BIP; null when the gas coin has no BIP price (then commission_bip is in source.stale) |
An undecodable or malformed tx is 400 bad_request; Cache-Control: public, max-age=5.
GET /v1/commissions
The network's current commission price table (price_commissions): one row per transaction type, plus the payload byte price. Field names are the node's; every amount is a decimal string with 18 digits, coin is the coin the table is denominated in.
curl 'https://api.denebnav.app/v1/commissions'{
"data": {
"coin": { "id": 1993, "symbol": "USDTE" },
"payload_byte": "0.000200000000000000",
"send": "0.010000000000000000",
"multisend_base": "0.010000000000000000",
"multisend_delta": "0.005000000000000000",
"delegate": "0.100000000000000000",
"unbond": "0.100000000000000000",
"move_stake": "0.200000000000000000",
"sell_pool_base": "0.100000000000000000",
"sell_pool_delta": "0.050000000000000000",
"create_swap_pool": "1.000000000000000000",
"failed_tx": "0.010000000000000000"
},
"source": { "height": 42105678, "time": "2026-10-20T08:18:49Z", "parts": { "commissions": "node" }, "stale": [] }
}The table is voted by validators and changes without a release: take prices from here, never from code. A fee for a concrete transaction is type row + payload_byte × bytes, in coin; GET /v1/estimate/tx-commission gives the exact number for a prepared transaction. Cache-Control: public, max-age=5.
Address and validator events
Rewards, slashes, unbond releases and bans of one address or validator, read from the Deneb chain index, newest first. The index stores rewards aggregated by day; there is no per-block reward list. Amounts are decimal strings with 18 fractional digits.
Query parameters (every list below):
| Parameter | Default | Limits | Meaning |
|---|---|---|---|
page | 1 | 1..100000 | 1-based page |
limit | 50 | 1..150 | items per page |
All lists are explorer-paginated ({data, links, meta}) and carry the standard source object: height and time are the index head, and parts.events names the index (an opaque label). page × limit must not exceed 10000 (a deeper page would make the index scan a huge prefix) — beyond that the answer is 400 bad_request. While the index is unavailable every route answers 503 unavailable. Cache-Control: public, max-age=5.
GET /v1/addresses/{addr}/events/rewards/aggregated
The address's rewards, aggregated by day (role is Validator, Delegator, DAO or Developers). Path parameter addr: Mx + 40 hex (the hex part is case-insensitive). This is explorer-api v2 /addresses/{a}/events/rewards/aggregated (the @minter/core addressRewards method).
curl 'https://api.denebnav.app/v1/addresses/Mx0000000000000000000000000000000000000001/events/rewards/aggregated?limit=2'{
"data": [
{
"time_id": "2026-10-20T00:00:00Z",
"timestamp": "2026-10-20T00:00:00Z",
"role": "Delegator",
"amount": "1.234567890123456789",
"address": "Mx0000000000000000000000000000000000000001",
"validator": { "public_key": "Mp0000000000000000000000000000000000000000000000000000000000000000", "name": null, "description": null, "icon_url": "", "site_url": null, "status": 2, "commission": 10 }
}
],
"links": { "first": "/v1/addresses/Mx.../events/rewards/aggregated?page=1", "last": "/v1/addresses/Mx.../events/rewards/aggregated?page=1", "prev": null, "next": null },
"meta": { "current_page": 1, "last_page": 1, "path": "/v1/addresses/Mx.../events/rewards/aggregated", "per_page": 50, "total": 1 },
"source": { "height": 40200123, "time": "2026-10-20T08:18:49Z", "parts": { "events": "index" }, "stale": [] }
}| Field | Type | Meaning |
|---|---|---|
data[].time_id / data[].timestamp | string | the aggregation day/time, RFC 3339 UTC |
data[].role | string | reward role: Validator, Delegator, DAO or Developers |
data[].amount | string | reward amount, decimal string |
data[].address | string | the rewarded address |
data[].validator | object | validator metadata, see the validators section |
GET /v1/addresses/{addr}/events/slashes
The address's slashes (stake penalties). Path parameter addr as above.
curl 'https://api.denebnav.app/v1/addresses/Mx0000000000000000000000000000000000000001/events/slashes'{
"data": [
{
"height": 42100000,
"coin": { "id": 0, "symbol": "BIP" },
"amount": "0.500000000000000000",
"address": "Mx0000000000000000000000000000000000000001",
"timestamp": "2026-10-20T08:18:49Z",
"validator": { "public_key": "Mp...", "name": null, "description": null, "icon_url": "", "site_url": null, "status": 2, "commission": 10 }
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": null },
"meta": { "current_page": 1, "last_page": 1, "path": "/v1/addresses/Mx.../events/slashes", "per_page": 50, "total": 1 },
"source": { "height": 40200123, "time": "2026-10-20T08:18:49Z", "parts": { "events": "index" }, "stale": [] }
}| Field | Type | Meaning |
|---|---|---|
data[].height | number | block height of the slash |
data[].coin | object | {id, symbol} of the slashed coin |
data[].amount | string | slashed amount, decimal string |
data[].address | string | the slashed address |
data[].timestamp | string | block time, RFC 3339 UTC |
data[].validator | object | validator metadata |
GET /v1/addresses/{addr}/events/unbonds
The address's unbond releases: a stake that left unbonding and is returned to the address. The index stores the release block; start_height is end_height − 518400 (the 30-day unbond period). Path parameter addr as above.
curl 'https://api.denebnav.app/v1/addresses/Mx0000000000000000000000000000000000000001/events/unbonds'{
"data": [
{
"coin": { "id": 0, "symbol": "BIP" },
"address": "Mx0000000000000000000000000000000000000001",
"value": "100.000000000000000000",
"validator": { "public_key": "Mp...", "name": null, "description": null, "icon_url": "", "site_url": null, "status": 2, "commission": 10 },
"end_height": 42100000,
"start_height": 41581600,
"type": "unbond"
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": null },
"meta": { "current_page": 1, "last_page": 1, "path": "/v1/addresses/Mx.../events/unbonds", "per_page": 50, "total": 1 },
"source": { "height": 40200123, "time": "2026-10-20T08:18:49Z", "parts": { "events": "index" }, "stale": [] }
}| Field | Type | Meaning |
|---|---|---|
data[].coin | object | {id, symbol} of the released coin |
data[].address | string | the address |
data[].value | string | released amount, decimal string |
data[].validator | object | validator metadata |
data[].end_height | number | block the stake is released at |
data[].start_height | number | block the unbond started at (end_height − 518400) |
data[].type | string | always unbond |
GET /v1/validators/{pk}/events/{rewards|slashes|bans}
The same data per validator. Path parameter pk: Mp + 64 hex (the hex part is case-insensitive). rewards is the validator's daily reward rows (all roles); slashes and bans are the validator's slashes and jailing bans. A validator that the index does not know answers an empty list.
curl 'https://api.denebnav.app/v1/validators/Mp0000000000000000000000000000000000000000000000000000000000000000/events/bans'{
"data": [
{ "height": 42100000, "timestamp": "2026-10-20T08:18:49Z", "to_block_id": 42123456 }
],
"links": { "first": "...", "last": "...", "prev": null, "next": null },
"meta": { "current_page": 1, "last_page": 1, "path": "/v1/validators/Mp.../events/bans", "per_page": 50, "total": 1 },
"source": { "height": 40200123, "time": "2026-10-20T08:18:49Z", "parts": { "events": "index" }, "stale": [] }
}rewards rows have the same fields as the address rewards; slashes rows the same as the address slashes. A ban row is {height, timestamp, to_block_id}: the block the validator was jailed at and the block it is jailed until.