Response envelope
Lists and details return { data, meta }. meta.ledger_index is the ledger this node had applied when it answered. Paginated lists also include count, page, and per_page.
XahauIndex snapshots the current ledger, follows it live, and serves enriched REST + WebSocket APIs for IOUs, URITokens, issuer profiles, DEX candles, and Hooks. No API key. Operators can turn on a per-IP rate limit. Put a reverse proxy in front if you want TLS.
XahauIndex is an independent PuppyTools project. It is not affiliated with, endorsed by, or a product of the Xahau network or its operators. The XI mark is original artwork inspired by the official letterforms in Xahau/Graphics.
Donations in XAH: rPUPpkfohJsWVoXoXDbNZ7zKfk2FBB8Xwo
Feel free to test this instance. These are the limits on this process.
/v1/subscribe — 2 concurrent sockets per IPEvery successful JSON body uses the same envelope. Identifiers never cram : or + into one path segment.
Lists and details return { data, meta }. meta.ledger_index is the ledger this node had applied when it answered. Paginated lists also include count, page, and per_page.
/v1/tokens/{currency}/{issuer} — e.g. /v1/tokens/USD/rHb9…. Currency is a 3-character code or 40-character hex. Issuer is an r-address.
/v1/prices/{base}/{counter} with base_issuer / counter_issuer when that side is an IOU. Native XAH has a null issuer and needs no issuer query.
IOU values stay decimal strings (including scientific notation from the ledger). XAH drops are converted to XAH for DEX quantities. Icon fields are HTTPS/IPFS links only — this node never caches image bytes.
Same node, three consumers. All of these are live on this instance after snapshot completes (/v1/status → live).
Token list: GET /v1/tokens?q= or filter domain_verified=true. Show icon_url, toml_links, blackholed. URITokens the user owns: GET /v1/uritokens?owner={account}. Issuer badge: GET /v1/issuers/{account} — domain_verified is Xahau xahau.toml only.
Health: GET /v1/status (ledger_index vs network tip). Holders: /v1/tokens/{currency}/{issuer}/holders. NFT: /v1/uritokens/{id} (metadata, remarks, transfers). Hooks: /v1/hooks/{account} — triggers for HookOn, definition.code_size without downloading WASM.
Candles: GET /v1/prices/{base}/{counter}?period=1h&from=&to=. Tape: /v1/trades/{base}/{counter}. Native XAH has a null issuer — omit the issuer query. Live: subscribe to prices.
Copy-paste against this node. The same list lives in /docs/cookbook.md.
Token, URIToken, issuer, and Hook lists stay empty until snapshot_status is complete.
curl -s https://xahauindex.dev/v1/status
curl -s 'https://xahauindex.dev/v1/tokens?domain_verified=true&per_page=5'
curl -s https://xahauindex.dev/v1/tokens/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh
curl -s 'https://xahauindex.dev/v1/tokens/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh/holders?nonzero=true'
curl -s 'https://xahauindex.dev/v1/uritokens?owner=rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh&per_page=5'
id is the 64-character hex URITokenID. Packed on-chain URIs return metadata.source: "onchain".
curl -s https://xahauindex.dev/v1/uritokens/CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
curl -s https://xahauindex.dev/v1/issuers/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh
curl -s 'https://xahauindex.dev/v1/prices/USD/XAH?base_issuer=rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh&period=1h&limit=24'
curl -s 'https://xahauindex.dev/v1/trades/USD/XAH?base_issuer=rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh&per_page=5'
curl -s https://xahauindex.dev/v1/hooks/rHktfGUbjqzU4GsYCMc1pDjdHXb5CJamto
curl -s 'https://xahauindex.dev/v1/hooks/definitions?per_page=5'
Not a xahaud ledger / transactions subscribe. Those sockets emit raw protocol traffic. This one pushes the same enriched objects as REST (tokens, uritokens, prices, hooks) after this node has indexed them.
npx wscat -c wss://xahauindex.dev/v1/subscribe
# then send:
# {"command":"subscribe","streams":["tokens","uritokens","prices","hooks"]}
Failures are not wrapped in the data envelope.
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
| Code | When |
|---|---|
NOT_FOUND | Unknown route or object |
BAD_REQUEST | Missing IOU issuer, invalid JSON subscribe, or a 400 from validation |
RATE_LIMITED | Optional operator limit (API_RATE_LIMIT_MAX / API_WS_MAX_PER_IP). HTTP 429 plus Retry-After |
INTERNAL | Unexpected server error |
Indexer health, snapshot, and sync status. Use this to know whether balances are still catching the snapshot.
{
"data": {
"status": "live",
"snapshot_status": "complete",
"snapshot_ledger": 26272600,
"history_start_ledger": 26272601,
"backfill_status": "idle",
"backfill_from": null,
"backfill_ledger": null,
"ledger_index": 26272654,
"network_ledger_index": 26272654,
"lag_ledgers": 0,
"indexed_ledgers": 55,
"token_count": 128,
"uri_token_count": 4096,
"issuer_count": 64,
"uptime_seconds": 3600
},
"meta": {
"ledger_index": 26272654
}
}
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests"
}
}
IOU token metadata, remarks, and trust-line statistics
| Param | Description | |
|---|---|---|
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
sort | query | Sort by holder_count, trust_count, or first_ledger |
issuer | query | Filter by issuer r-address |
currency | query | Filter by 3-character code or 40-character hex |
domain_verified | query | If true, only tokens whose issuer passed xahau.toml verification |
q | query | Search by name or currency |
{
"data": [
{
"id": "USD:rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"currency": "USD",
"currency_hex": null,
"issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"name": "USD",
"description": "Example USD IOU",
"icon_url": "https://example.com/usd.png",
"website_url": "https://example.com",
"toml_links": [
{
"url": "https://example.com",
"type": "website",
"title": "Example"
}
],
"supply": "1000",
"holder_count": 12,
"trust_count": 20,
"domain_verified": true,
"blackholed": false,
"first_ledger": 100,
"last_updated": 26272654
}
],
"meta": {
"count": 1,
"page": 1,
"per_page": 5,
"ledger_index": 26272654
}
}
| Param | Description | |
|---|---|---|
currency | path | 3-character currency code or 40-character hex |
issuer | path | Issuer r-address |
{
"data": {
"id": "USD:rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"currency": "USD",
"currency_hex": null,
"issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"name": "USD",
"description": "Example USD IOU",
"icon_url": "https://example.com/usd.png",
"website_url": "https://example.com",
"toml_links": [
{
"url": "https://example.com",
"type": "website",
"title": "Example"
}
],
"supply": "1000",
"holder_count": 12,
"trust_count": 20,
"domain_verified": true,
"blackholed": false,
"first_ledger": 100,
"last_updated": 26272654,
"remarks": {
"name": "USD"
},
"issuer_profile": {
"account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"domain": "example.com",
"domain_verified": true,
"email_hash": null,
"transfer_rate": null,
"flags": null,
"blackholed": false,
"toml_name": "Example",
"toml_description": "Example issuer",
"toml_icon_url": "https://example.com/icon.png",
"toml_links": [
{
"url": "https://example.com",
"type": "website",
"title": "Example"
}
],
"has_hooks": false,
"token_count": 1,
"first_ledger": 100,
"last_updated": 26272654
},
"price": {
"price": 1.25,
"change_24h": 0.02,
"volume_24h": "420.5",
"high_24h": 1.3,
"low_24h": 1.2
}
},
"meta": {
"ledger_index": 26272654
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
| Param | Description | |
|---|---|---|
currency | path | 3-character currency code or 40-character hex |
issuer | path | Issuer r-address |
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
nonzero | query | If true, only balances that are not zero |
{
"data": [
{
"account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"currency": "USD",
"issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"balance": "12.5",
"limit_peer": "1000",
"flags": 0
}
],
"meta": {
"count": 1,
"page": 1,
"per_page": 20,
"ledger_index": 26272654
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
URIToken (Xahau native NFT) metadata and lifecycle
| Param | Description | |
|---|---|---|
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
sort | query | Sort by mint_ledger or last_updated |
issuer | query | Filter by issuer r-address |
owner | query | Filter by current owner r-address |
burned | query | Include burned tokens. Default false |
for_sale | query | If true, only tokens with an active sell offer |
{
"data": [
{
"id": "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC",
"uri": "ZXZybGVhc2VMVFYAAQAACAFnfryy9275fVMVSdiyfVQDjX6kxoAAMPnVSwAAAAAAAAAAAAAAAAAAAAAA",
"uri_raw": "5a585a79624756686332564d56465941415141414341466e667279793932373566564d5653646979665651446a58366b786f41414d506e565377",
"uri_kind": "onchain",
"digest": null,
"issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"flags": 1,
"sell_offer": null,
"destination": null,
"burned": false,
"burn_ledger": null,
"mint_ledger": 10,
"last_updated": 10,
"icon_url": null,
"metadata": {
"source": "onchain",
"format": "evrlease",
"lease_index": 0,
"name": "Evernode lease #0"
},
"transfer_count": 0
}
],
"meta": {
"count": 1,
"page": 1,
"per_page": 5,
"ledger_index": 26272654
}
}
| Param | Description | |
|---|---|---|
id | path | URITokenID (64 hex characters) |
{
"data": {
"id": "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC",
"uri": "ZXZybGVhc2VMVFYAAQAACAFnfryy9275fVMVSdiyfVQDjX6kxoAAMPnVSwAAAAAAAAAAAAAAAAAAAAAA",
"uri_raw": "5a585a79624756686332564d56465941415141414341466e667279793932373566564d5653646979665651446a58366b786f41414d506e565377",
"uri_kind": "onchain",
"digest": null,
"issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"flags": 1,
"sell_offer": null,
"destination": null,
"burned": false,
"burn_ledger": null,
"mint_ledger": 10,
"last_updated": 10,
"icon_url": null,
"metadata": {
"source": "onchain",
"format": "evrlease",
"lease_index": 0,
"name": "Evernode lease #0"
},
"remarks": {},
"transfer_count": 1,
"transfers": [
{
"from_account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"to_account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"price": null,
"ledger_index": 11,
"tx_hash": "11"
}
]
},
"meta": {
"ledger_index": 26272654
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
Issuer profiles with domain verification and remarks
| Param | Description | |
|---|---|---|
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
sort | query | Sort by token_count or first_ledger |
domain_verified | query | If true, only issuers that passed xahau.toml verification |
has_hooks | query | If true, only issuers that currently own a Hook object |
{
"data": [
{
"account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"domain": "example.com",
"domain_verified": true,
"email_hash": null,
"transfer_rate": null,
"flags": null,
"blackholed": false,
"toml_name": "Example",
"toml_description": "Example issuer",
"toml_icon_url": "https://example.com/icon.png",
"toml_links": [
{
"url": "https://example.com",
"type": "website",
"title": "Example"
}
],
"has_hooks": false,
"token_count": 1,
"first_ledger": 100,
"last_updated": 26272654
}
],
"meta": {
"count": 1,
"page": 1,
"per_page": 5,
"ledger_index": 26272654
}
}
| Param | Description | |
|---|---|---|
account | path | Issuer r-address |
{
"data": {
"account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"domain": "example.com",
"domain_verified": true,
"email_hash": null,
"transfer_rate": null,
"flags": null,
"blackholed": false,
"toml_name": "Example",
"toml_description": "Example issuer",
"toml_icon_url": "https://example.com/icon.png",
"toml_links": [
{
"url": "https://example.com",
"type": "website",
"title": "Example"
}
],
"has_hooks": false,
"token_count": 1,
"first_ledger": 100,
"last_updated": 26272654,
"remarks": {},
"tokens": [],
"hooks": null
},
"meta": {
"ledger_index": 26272654
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
DEX-derived historical OHLCV and trade tape
Calendar-aligned UTC candles. History starts at history_start_ledger.
Examples:
- /v1/prices/USD/XAH?base_issuer=rHb9…&period=1h&from=1717200000&to=1717286400
- /v1/prices/USD/EUR?base_issuer=rA…&counter_issuer=rB…&from_ledger=9000000&to_ledger=9001000
| Param | Description | |
|---|---|---|
base | path | Base currency code (XAH or IOU code / hex) |
counter | path | Counter currency code (XAH or IOU code / hex) |
base_issuer | query | Required when base is not XAH |
counter_issuer | query | Required when counter is not XAH |
period | query | Calendar candle size. 1h, 24h, or 7d (default 24h) |
from | query | Inclusive unix timestamp (seconds) |
to | query | Exclusive unix timestamp (seconds) |
from_ledger | query | Inclusive ledger index |
to_ledger | query | Inclusive ledger index |
limit | query | Max rows when no range is given (or cap when a range is given) |
{
"data": [
{
"open_time": 1717200000,
"open_ledger": 26272000,
"close_ledger": 26272654,
"open": 1.2,
"high": 1.3,
"low": 1.19,
"close": 1.25,
"volume": "420.5",
"trade_count": 8
}
],
"meta": {
"ledger_index": 26272654,
"history_start_ledger": 26272601
}
}
{
"error": {
"code": "BAD_REQUEST",
"message": "base_issuer is required when base is not XAH"
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
| Param | Description | |
|---|---|---|
base | path | Base currency code (XAH or IOU code / hex) |
counter | path | Counter currency code (XAH or IOU code / hex) |
base_issuer | query | Required when base is not XAH |
counter_issuer | query | Required when counter is not XAH |
from | query | Inclusive unix timestamp (seconds) |
to | query | Exclusive unix timestamp (seconds) |
from_ledger | query | Inclusive ledger index |
to_ledger | query | Inclusive ledger index |
limit | query | Max rows when no range is given (or cap when a range is given) |
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
{
"data": [
{
"base_currency": "USD",
"base_issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"counter_currency": "XAH",
"counter_issuer": null,
"price": 1.25,
"base_amount": "10",
"counter_amount": "12.5",
"taker": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"maker": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"ledger_index": 26272654,
"close_time": 1717203600,
"tx_hash": "22"
}
],
"meta": {
"count": 1,
"page": 1,
"per_page": 5,
"ledger_index": 26272654,
"history_start_ledger": 26272601
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
Accounts that currently own a Hook ledger object. Each slot includes the install fields plus the shared HookDefinition. HookOn bitmasks become triggers. WASM is not stored. Empty slots are dropped.
Shared HookDefinition metadata (code_size, defaults, fees). Bytecode is not stored.
| Param | Description | |
|---|---|---|
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
{
"data": [
{
"hook_hash": "1F7C84E14313C4FF2D4F39535428BF10767CCF8E87EFB51306CC3F94D13439EC",
"code_size": 500,
"reference_count": 12,
"hook_fee": "74",
"label": {
"name": "Evernode heartbeat",
"project": "Evernode",
"description": "Host heartbeats and reward distribution",
"url": "https://docs.evernode.org/en/latest/platform/hooks/overview.html",
"source": "catalog"
}
}
],
"meta": {
"page": 1,
"per_page": 5,
"ledger_index": 26272654
}
}
| Param | Description | |
|---|---|---|
hook_hash | path | HookDefinition hash (64 hex characters) |
{
"data": {
"hook_hash": "1F7C84E14313C4FF2D4F39535428BF10767CCF8E87EFB51306CC3F94D13439EC",
"hook_namespace": null,
"hook_on": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFF",
"hook_on_incoming": null,
"hook_on_outgoing": null,
"hook_can_emit": null,
"hook_name": null,
"hook_api_version": 0,
"parameters": [],
"reference_count": 12,
"code_size": 500,
"hook_fee": "74",
"hook_callback_fee": null,
"hook_set_txn_id": null,
"flags": null,
"triggers": {
"raw": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFF",
"mode": "none",
"types": []
},
"label": {
"name": "Evernode heartbeat",
"project": "Evernode",
"description": "Host heartbeats and reward distribution",
"url": "https://docs.evernode.org/en/latest/platform/hooks/overview.html",
"source": "catalog"
},
"first_ledger": 100,
"last_updated": 26272654
},
"meta": {
"ledger_index": 26272654
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
404 if that account has no indexed Hook object.
| Param | Description | |
|---|---|---|
account | path | Account r-address |
{
"data": {
"account": "rHktfGUbjqzU4GsYCMc1pDjdHXb5CJamto",
"hook_count": 1,
"hooks": [
{
"hook_hash": "1F7C84E14313C4FF2D4F39535428BF10767CCF8E87EFB51306CC3F94D13439EC",
"label": {
"name": "Evernode heartbeat",
"project": "Evernode",
"description": "Host heartbeats and reward distribution",
"url": "https://docs.evernode.org/en/latest/platform/hooks/overview.html",
"source": "catalog"
},
"triggers": {
"raw": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFF",
"mode": "none",
"types": []
},
"definition": {
"hook_hash": "1F7C84E14313C4FF2D4F39535428BF10767CCF8E87EFB51306CC3F94D13439EC",
"code_size": 500,
"reference_count": 12,
"hook_fee": "74",
"label": {
"name": "Evernode heartbeat",
"project": "Evernode",
"description": "Host heartbeats and reward distribution",
"url": "https://docs.evernode.org/en/latest/platform/hooks/overview.html",
"source": "catalog"
}
}
}
],
"first_ledger": 100,
"last_updated": 26272654
},
"meta": {
"ledger_index": 26272654
}
}
{
"error": {
"code": "NOT_FOUND",
"message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
}
}
| Param | Description | |
|---|---|---|
page | query | Page number. Default 1 |
per_page | query | Rows per page (1–100). Default 20 |
hook_hash | query | Only accounts that currently install this hash |
{
"data": [
{
"account": "rHktfGUbjqzU4GsYCMc1pDjdHXb5CJamto",
"hook_count": 1,
"hooks": [
{
"hook_hash": "1F7C84E14313C4FF2D4F39535428BF10767CCF8E87EFB51306CC3F94D13439EC",
"label": {
"name": "Evernode heartbeat",
"project": "Evernode",
"description": "Host heartbeats and reward distribution",
"url": "https://docs.evernode.org/en/latest/platform/hooks/overview.html",
"source": "catalog"
},
"triggers": {
"raw": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFF",
"mode": "none",
"types": []
},
"definition": {
"hook_hash": "1F7C84E14313C4FF2D4F39535428BF10767CCF8E87EFB51306CC3F94D13439EC",
"code_size": 500,
"reference_count": 12,
"hook_fee": "74",
"label": {
"name": "Evernode heartbeat",
"project": "Evernode",
"description": "Host heartbeats and reward distribution",
"url": "https://docs.evernode.org/en/latest/platform/hooks/overview.html",
"source": "catalog"
}
}
}
],
"first_ledger": 100,
"last_updated": 26272654
}
],
"meta": {
"count": 1,
"page": 1,
"per_page": 5,
"ledger_index": 26272654
}
}
Indexed metadata streams on the same port as REST. This is not xahaud WebSocket subscribe (ledger, transactions, books). Use a public or self-hosted xahaud socket for the raw firehose; use this for live token, URIToken, price, and hook objects already mapped like the REST API.
Not a stand-in for wss://xahau.network or your own xahaud WebSocket. xahaud subscribe emits raw ledgers, transactions, and books. This endpoint emits the objects this node has already indexed — the same shapes as GET /v1/tokens, /v1/uritokens, /v1/trades, and /v1/hooks, including remarks, issuer fields, and decoded HookOn. Streams are tokens, uritokens, prices, and hooks. One connection, multiple streams, same HTTP port (no separate WS host). unsubscribe uses the same shape. Unknown commands and invalid JSON return the standard error object. When the operator cap is on, extra sockets from the same IP are rejected with RATE_LIMITED.
{
"command": "subscribe",
"streams": [
"tokens",
"uritokens",
"prices",
"hooks"
]
}
{
"type": "subscribed",
"streams": [
"tokens",
"prices"
]
}
{
"stream": "tokens",
"event": "update",
"ledger_index": 26272654,
"data": {
"currency": "USD",
"issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"
}
}
Field-level contract from docs/openapi.yaml. Nullable strings are JSON null, not omitted, unless noted as optional.
id | Internal currency:issuer |
currency | Display code |
currency_hex | |
issuer | |
name | |
description | |
icon_url | Token icon URL from remarks or the issuer TOML. Stored as a link only; images are not cached. |
website_url | |
toml_links | |
supply | Sum of non-issuer holder balances, decimal string |
holder_count | Non-zero holders |
trust_count | All trust lines |
domain_verified | Copied from the issuer (xahau.toml only) |
blackholed | Copied from the issuer |
first_ledger | |
last_updated | |
remarks | Decoded remark name/value map |
id | URITokenID |
uri | Decoded URI |
uri_raw | Original hex URI blob |
uri_kind | How the URI is interpreted. onchain means the 256-byte URI is packed data, not a URL. |
digest | |
issuer | |
owner | |
flags | |
sell_offer | |
destination | Restricted buyer on the active sell offer |
burned | |
burn_ledger | |
mint_ledger | |
last_updated | |
icon_url | On-ledger or URI-metadata image link. The indexer stores the URL only and never caches image bytes. |
metadata | Fetched HTTPS JSON when the URI is a document URL. When the URI is packed on-chain data (Evernode evrlease, printable text, or raw bytes), this is a decoded object with source: onchain instead. |
remarks | Decoded remark name/value map |
transfer_count |
account | |
domain | Printable AccountRoot Domain |
domain_verified | True only when /.well-known/xahau.toml lists this r-address |
email_hash | |
transfer_rate | |
flags | |
blackholed | |
toml_name | |
toml_description | |
toml_icon_url | |
toml_links | |
has_hooks | |
token_count | |
first_ledger | |
last_updated | |
remarks | Decoded remark name/value map |
hook_hash | SHA-512Half of the WASM — the HookDefinition id |
label | Static catalog name when the hash or Evernode system account is known |
hook_on | |
hook_on_incoming | |
hook_on_outgoing | |
hook_can_emit | |
hook_namespace | |
hook_name | NamedHooks trigger (4–16 bytes), not a product title |
hook_api_version | |
parameters | |
grants | |
triggers | Decoded HookOn (all_except, only, or none) |
definition | Shared defaults, code_size, fees. No bytecode |
hook_hash | |
label | Read-time catalog name. Hash match wins; if the hash is unknown the install account is checked (Evernode system accounts stay labeled after a hash rotation). |
hook_namespace | |
hook_on | |
hook_on_incoming | |
hook_on_outgoing | |
hook_can_emit | |
hook_name | |
hook_api_version | |
parameters | |
reference_count | |
code_size | |
hook_fee | |
hook_callback_fee | |
hook_set_txn_id | |
flags | |
triggers | |
triggers_incoming | |
triggers_outgoing | |
can_emit | |
first_ledger | |
last_updated |
open_time | UTC period start, unix seconds |
open_ledger | |
close_ledger | |
open | |
high | |
low | |
close | |
volume | Base-side decimal string |
trade_count |
status | syncing while the snapshot is unfinished · live when current · degraded if lag grows |
snapshot_status | Token, URIToken, issuer, and Hook lists stay empty until complete |
snapshot_ledger | Ledger the snapshot walked. Restarting a complete node does not re-walk those objects |
history_start_ledger | Earliest ledger with collected history (backfill frontier while walking down, backfill_from when complete, else live_from_ledger) |
backfill_status | Optional historical walk (DEX trades + URIToken transfers only) |
backfill_from | Earliest ledger the historical backfill walks down to |
backfill_ledger | Lowest historical ledger successfully applied so far (walks snapshot → FROM) |
ledger_index | |
network_ledger_index | |
lag_ledgers | Network tip minus last applied ledger |
indexed_ledgers | |
token_count | |
uri_token_count | |
issuer_count | |
uptime_seconds |