Documentation

Everything written about XRO, grouped by what you are trying to do. The developer reference at the bottom is the part you will not find elsewhere.

New to XRO

If you hold XRO

Running a node

Developer reference

All of the following is verified against the live services rather than copied from a specification. Where XRO differs from Nano, it is called out.

Node RPC

POST https://api.raione.cc

Sends Access-Control-Allow-Origin: *, so a browser on any origin can query it with no backend in between. JSON in, JSON out, the standard Nano RPC shape. It is action-whitelisted: anything not listed below returns {"error":"action not permitted"}.

PermittedNotes
block_countTotals, cemented and unchecked.
telemetryAccount count, peers, uptime, and active_difficulty.
confirmation_quorumOnline stake and the quorum delta. The basis for any decentralisation measure.
representatives / representatives_onlinePass weight: "true" for weights.
available_supply
versionNode, protocol and store versions.
account_infoTakes representative, pending, weight flags.
account_history
block_info / blocks_infoUse json_block: "true".
accounts_frontiers, frontier_count
BlockedWhat that rules out
ledgerYou cannot enumerate accounts, so a rich list is impossible client-side.
confirmation_historyNo network-wide recent-blocks feed. A real explorer needs its own indexer.
peers, stats, active_difficulty
wallet_*, block_create, keepaliveAll control actions.

Two things that will bite you

Raw amounts are 1030 per XRO. That is far past 253, where a JavaScript number stops being exact, and past what a 64-bit integer column holds. Keep every ledger amount as a string or a BigInt from the JSON through to the formatted output. Converting to a float anywhere in between silently loses precision on ordinary balances.

subtype is top level on a block_info response, not inside contents. Reading contents.subtype gives undefined and no error.

Work threshold. XRO enforces 0xfffffe0000000000, which is Nano's receive threshold, not its send threshold. Work generated against Nano's send difficulty is accepted, but work validated against it will reject blocks the network considers fine. Confirm against telemetry.active_difficulty.

WebSocket

wss://ws.raione.cc

Upgrades from a browser origin and accepts the standard subscription message: {"action":"subscribe","topic":"confirmation"}. Be aware the chain is quiet, so a live feed can sit silent for minutes. Design the empty state to say idle rather than look broken.

Faucet and folding services

https://faucet.raiblocks.one/api/status · https://fold.raiblocks.one/api/{config,leaderboard,status}

Both use exact-origin CORS allowlists rather than a wildcard, so a new origin is refused until it is added server-side. The folding endpoints take ?address= or ?token=, and /api/config exposes dry_run as the machine-readable "are payouts running" flag.

/api/leaderboard publishes points_to_xro_ratio but not the income share or reserve that the payout curve actually uses, so the nominal rate it implies is higher than what folders receive. Treat it as a ceiling.

The Folding@home API itself cannot be read from a browser. api.foldingathome.org returns Vary: Origin but no allow-origin header, so team points have to come from the folding service instead.