Xahau network · self-hosted

Self-hostable data layer for your wallet, explorer, or dapp.

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.

Try this node

Feel free to test this instance. These are the limits on this process.

  • HTTP — 60 requests per IP every 1 minute
  • /v1/subscribe — 2 concurrent sockets per IP

Conventions

Every successful JSON body uses the same envelope. Identifiers never cram : or + into one path segment.

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.

Token URLs

/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.

Pair URLs

/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.

Amounts

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.

Recipes

Same node, three consumers. All of these are live on this instance after snapshot completes (/v1/status → live).

Wallet

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.

Explorer

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.

DEX UI

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.

Cookbook

Copy-paste against this node. The same list lives in /docs/cookbook.md.

Wait for the snapshot

Token, URIToken, issuer, and Hook lists stay empty until snapshot_status is complete.

curl -s https://xahauindex.dev/v1/status

List verified tokens

curl -s 'https://xahauindex.dev/v1/tokens?domain_verified=true&per_page=5'

Token detail

curl -s https://xahauindex.dev/v1/tokens/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh

Token holders

curl -s 'https://xahauindex.dev/v1/tokens/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh/holders?nonzero=true'

URITokens for an owner

curl -s 'https://xahauindex.dev/v1/uritokens?owner=rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh&per_page=5'

URIToken detail

id is the 64-character hex URITokenID. Packed on-chain URIs return metadata.source: "onchain".

curl -s https://xahauindex.dev/v1/uritokens/CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Issuer profile

curl -s https://xahauindex.dev/v1/issuers/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh

OHLCV candles

curl -s 'https://xahauindex.dev/v1/prices/USD/XAH?base_issuer=rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh&period=1h&limit=24'

DEX trade tape

curl -s 'https://xahauindex.dev/v1/trades/USD/XAH?base_issuer=rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh&per_page=5'

Account hook state

curl -s https://xahauindex.dev/v1/hooks/rHktfGUbjqzU4GsYCMc1pDjdHXb5CJamto

Hook definitions

curl -s 'https://xahauindex.dev/v1/hooks/definitions?per_page=5'

WebSocket subscribe

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"]}

Errors

Failures are not wrapped in the data envelope.

{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}
CodeWhen
NOT_FOUNDUnknown route or object
BAD_REQUESTMissing IOU issuer, invalid JSON subscribe, or a 400 from validation
RATE_LIMITEDOptional operator limit (API_RATE_LIMIT_MAX / API_WS_MAX_PER_IP). HTTP 429 plus Retry-After
INTERNALUnexpected server error

Status

Indexer health, snapshot, and sync status. Use this to know whether balances are still catching the snapshot.

GET /v1/status Open
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Too many requests"
  }
}

Tokens

IOU token metadata, remarks, and trust-line statistics

GET /v1/tokens Open
ParamDescription
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
sortquerySort by holder_count, trust_count, or first_ledger
issuerqueryFilter by issuer r-address
currencyqueryFilter by 3-character code or 40-character hex
domain_verifiedqueryIf true, only tokens whose issuer passed xahau.toml verification
qquerySearch by name or currency
Sample response
{
  "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
  }
}
GET /v1/tokens/{currency}/{issuer}
ParamDescription
currencypath3-character currency code or 40-character hex
issuerpathIssuer r-address
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}
GET /v1/tokens/{currency}/{issuer}/holders
ParamDescription
currencypath3-character currency code or 40-character hex
issuerpathIssuer r-address
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
nonzeroqueryIf true, only balances that are not zero
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}

URITokens

URIToken (Xahau native NFT) metadata and lifecycle

GET /v1/uritokens Open
ParamDescription
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
sortquerySort by mint_ledger or last_updated
issuerqueryFilter by issuer r-address
ownerqueryFilter by current owner r-address
burnedqueryInclude burned tokens. Default false
for_salequeryIf true, only tokens with an active sell offer
Sample response
{
  "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
  }
}
GET /v1/uritokens/{id}
ParamDescription
idpathURITokenID (64 hex characters)
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}

Issuers

Issuer profiles with domain verification and remarks

GET /v1/issuers Open
ParamDescription
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
sortquerySort by token_count or first_ledger
domain_verifiedqueryIf true, only issuers that passed xahau.toml verification
has_hooksqueryIf true, only issuers that currently own a Hook object
Sample response
{
  "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
  }
}
GET /v1/issuers/{account}
ParamDescription
accountpathIssuer r-address
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}

Prices & trades

DEX-derived historical OHLCV and trade tape

GET /v1/prices/{base}/{counter}

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

ParamDescription
basepathBase currency code (XAH or IOU code / hex)
counterpathCounter currency code (XAH or IOU code / hex)
base_issuerqueryRequired when base is not XAH
counter_issuerqueryRequired when counter is not XAH
periodqueryCalendar candle size. 1h, 24h, or 7d (default 24h)
fromqueryInclusive unix timestamp (seconds)
toqueryExclusive unix timestamp (seconds)
from_ledgerqueryInclusive ledger index
to_ledgerqueryInclusive ledger index
limitqueryMax rows when no range is given (or cap when a range is given)
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "BAD_REQUEST",
    "message": "base_issuer is required when base is not XAH"
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}
GET /v1/trades/{base}/{counter}
ParamDescription
basepathBase currency code (XAH or IOU code / hex)
counterpathCounter currency code (XAH or IOU code / hex)
base_issuerqueryRequired when base is not XAH
counter_issuerqueryRequired when counter is not XAH
fromqueryInclusive unix timestamp (seconds)
toqueryExclusive unix timestamp (seconds)
from_ledgerqueryInclusive ledger index
to_ledgerqueryInclusive ledger index
limitqueryMax rows when no range is given (or cap when a range is given)
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}

Hooks

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.

GET /v1/hooks/definitions Open

Shared HookDefinition metadata (code_size, defaults, fees). Bytecode is not stored.

ParamDescription
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
Sample response
{
  "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
  }
}
GET /v1/hooks/definitions/{hook_hash}
ParamDescription
hook_hashpathHookDefinition hash (64 hex characters)
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}
GET /v1/hooks/{account}

404 if that account has no indexed Hook object.

ParamDescription
accountpathAccount r-address
Sample response
{
  "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
  }
}
Sample response
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Token USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh not found"
  }
}
GET /v1/hooks Open
ParamDescription
pagequeryPage number. Default 1
per_pagequeryRows per page (1–100). Default 20
hook_hashqueryOnly accounts that currently install this hash
Sample response
{
  "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
  }
}

WebSocket

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.

WS /v1/subscribe

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.

Subscribe
{
  "command": "subscribe",
  "streams": [
    "tokens",
    "uritokens",
    "prices",
    "hooks"
  ]
}
Ack
{
  "type": "subscribed",
  "streams": [
    "tokens",
    "prices"
  ]
}
Event
{
  "stream": "tokens",
  "event": "update",
  "ledger_index": 26272654,
  "data": {
    "currency": "USD",
    "issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"
  }
}

Schemas

Field-level contract from docs/openapi.yaml. Nullable strings are JSON null, not omitted, unless noted as optional.

Token

idInternal currency:issuer
currencyDisplay code
currency_hex
issuer
name
description
icon_urlToken icon URL from remarks or the issuer TOML. Stored as a link only; images are not cached.
website_url
toml_links
supplySum of non-issuer holder balances, decimal string
holder_countNon-zero holders
trust_countAll trust lines
domain_verifiedCopied from the issuer (xahau.toml only)
blackholedCopied from the issuer
first_ledger
last_updated
remarksDecoded remark name/value map

URIToken

idURITokenID
uriDecoded URI
uri_rawOriginal hex URI blob
uri_kindHow the URI is interpreted. onchain means the 256-byte URI is packed data, not a URL.
digest
issuer
owner
flags
sell_offer
destinationRestricted buyer on the active sell offer
burned
burn_ledger
mint_ledger
last_updated
icon_urlOn-ledger or URI-metadata image link. The indexer stores the URL only and never caches image bytes.
metadataFetched 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.
remarksDecoded remark name/value map
transfer_count

Issuer

account
domainPrintable AccountRoot Domain
domain_verifiedTrue 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
remarksDecoded remark name/value map

HookEntry

hook_hashSHA-512Half of the WASM — the HookDefinition id
labelStatic 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_nameNamedHooks trigger (4–16 bytes), not a product title
hook_api_version
parameters
grants
triggersDecoded HookOn (all_except, only, or none)
definitionShared defaults, code_size, fees. No bytecode

HookDefinition

hook_hash
labelRead-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

OHLCVCandle

open_timeUTC period start, unix seconds
open_ledger
close_ledger
open
high
low
close
volumeBase-side decimal string
trade_count

Status

statussyncing while the snapshot is unfinished · live when current · degraded if lag grows
snapshot_statusToken, URIToken, issuer, and Hook lists stay empty until complete
snapshot_ledgerLedger the snapshot walked. Restarting a complete node does not re-walk those objects
history_start_ledgerEarliest ledger with collected history (backfill frontier while walking down, backfill_from when complete, else live_from_ledger)
backfill_statusOptional historical walk (DEX trades + URIToken transfers only)
backfill_fromEarliest ledger the historical backfill walks down to
backfill_ledgerLowest historical ledger successfully applied so far (walks snapshot → FROM)
ledger_index
network_ledger_index
lag_ledgersNetwork tip minus last applied ledger
indexed_ledgers
token_count
uri_token_count
issuer_count
uptime_seconds