Skip to content

REST API ​

Two HTTP services expose the chain:

ServiceDefaultUse
Gateway (Node.js)http://localhost:3000What dApps and the web app call. Proxies the node, adds WebSocket, AI tooling and caching
Node RPC (Rust)http://localhost:9933The source of truth. Some operator endpoints exist only here

Most paths are the same on both. The tables below mark endpoints that exist on only one of them. Examples use $GATEWAY and $NODE_RPC — see Start here.

Conventions ​

Amounts ​

  • On-chain amounts are integers in uNRO (1 NRO = 1 000 000 uNRO).
  • Responses add a formatted *_human string next to each amount (balance_human, value_human, stake_human, …). Display those; do not convert in the client.
  • In request bodies, send amounts as JSON numbers in uNRO unless the endpoint says otherwise.

Signed operations ​

Every endpoint that changes state needs a signature. Two kinds:

KindSigned messagenonce
Transaction (POST /api/v1/transactions)`nc-tx-v2from
Operation (everything else)`nc-tx-v2actor

The target is a reserved system address naming the operation; the tables give it in the Signs for column. Each request carries signature (hex), public_key (hex ML-DSA-65) and nonce. See Wallet → Signed operations.

With CHAIN_ENV=mainnet (the default), a missing or invalid signature is refused with 401. With CHAIN_ENV=testnet the node logs a warning instead — for local development only.

Most operations are applied in consensus: the response says "status": "pending" and returns a tx_hash; the effect is visible once that transaction is in a block.

Errors ​

Errors are JSON: {"error": "<message>"}, sometimes with hint or extra fields. HTTP codes used:

CodeMeaning
200Success — but some older endpoints also return {"error": …} with 200; always check for error
400Bad request, failed validation, Sentinel rejection
401Missing or invalid signature, key not bound to the address
403Forbidden in this mode (faucet on mainnet, write call without consensus on mainnet), deploy refused by VMGuardian
404Not found
409Name already taken
429Rate limited
502 / 503Gateway cannot reach the node

Pagination ​

List endpoints take limit and offset (some also page). Each endpoint caps limit (typically 100 or 200).

Rate limits and CORS ​

WhereDefaultVariable
Node RPC, per IP100 requests/sNEUROCHAIN_RPC_RATE_LIMIT
Gateway, per IP200 requests/sGLOBAL_RL_MAX_RPS
Gateway AI endpoints (/contracts/audit, /contracts/generate, …), per IP10 requests/minAI_RL_MAX_RPM

Allowed origins: CORS_ALLOWED_ORIGINS on both services (default *).


Network and node ​

MethodPathNotes
GET/healthstatus, height, round, mempool, peers, tps, total_txs, validator_count, bft_quorum, bft_ready
GET/status, /api/v1/statusNode only. Height, validators, shards, network name
GET/api/v1/network/statusGateway only. Network summary for the explorer
GET/metricsPrometheus text format — see Run a node
GET/api/v1/shardsPer-shard heights and roots
GET/api/v1/state/rootglobal_root, shard_roots, height, root_height, n_shards
GET/api/v1/state/snapshotNode only. Full signed state snapshot for bootstrapping a node
GET/api/v1/checkpointsSigned checkpoints. offset, limit
GET/peersNode only. Connected peers
GET/api/v1/gas/estimatebase_fee, gas per operation, total_burned, nft_transfer_fee — see Gas & fees
GET/api/v1/wasm/versionGateway only. Version manifest of the browser WASM module

Blocks ​

MethodPathNotes
GET/api/v1/blockslimit (≤ 100, default 20), offset, page. Newest first
GET/api/v1/blocks/latestGateway only. { "block": … }
GET/api/v1/blocks/:heightOne block: height, hash, parent_hash, proposer, tx_root, state_root, tx_count, gas_used, base_fee, fees_burned, shard, round, timestamp
GET/api/v1/blocks/:height/transactionsTransactions in the block

Transactions ​

MethodPathSigns forNotes
POST/api/v1/transactionsthe transaction itselfBody below
GET/api/v1/transactions—address, hash, type (staking to list staking operations), limit (≤ 200), offset, page
GET/api/v1/transactions/:hash—One transaction with status, gas, fee, fee_human, value_human
GET/api/v1/tx/:hash/proof—Merkle inclusion proof: leaf_index, proof, tx_root, block_height
POST/api/v1/transactions/:hash/confirmneuro:system.trustConfirm a held transfer (owner's main key only) — see Sentinel
POST/api/v1/transactions/:hash/cancelneuro:system.trustCancel a held transfer
GET/api/v1/held/:address—Held transfers of an address
GET/api/v1/cross-shard/queue—Cross-shard relays. status, limit, offset

POST /api/v1/transactions body

FieldTypeRequiredMeaning
fromstringyesSender address
tostringyesRecipient, contract, or neuro:system.deploy
valuenumberyesuNRO
noncenumberyesNext account nonce
signaturestringyesML-DSA-65 over `nc-tx-v2
public_keystringyesML-DSA-65 public key, hex
gas_pricenumbernouNRO per gas unit; must be ≥ the base fee
datastringnoContract call or deploy as a JSON string (hex also accepted) — see ABI, Deploy

Response: tx_hash, status: "pending", estimated_block; plus sentinel_score and sentinel_warning when Sentinel flags it, or held details when the policy layer holds it.

Accounts ​

MethodPathNotes
GET/api/v1/accounts/:addressbalance, balance_human, nonce, …
GET/api/v1/accounts/:address/transactionsHistory. limit, offset
GET/api/v1/accounts/:address/token-transfersToken (NRC-20) transfers involving the address
GET/api/v1/accounts/:address/totalsNode only. Totals sent and received
POST/api/v1/faucetTest networks only (CHAIN_ENV=testnet). Body: address, public_key, amount (uNRO, optional)
POST/api/v1/wallet/derive-addressBody: words. Derives the .human address from a phrase — sends the phrase to the server. Off on mainnet; on test networks only with NEUROCHAIN_ALLOW_SERVER_DERIVE=true

Names and NFTs ​

MethodPathSigns forBody / notes
POST/api/v1/addresses/humanneuro:system.nameNode only. name, owner, + signed fields. Registers a custom .human name
GET/api/v1/addresses/human/price—Node only. ?name= → price by length
POST/api/v1/nodes/registerneuro:system.nodename, owner, optional node_address (to register .app / .vault), + signed fields
GET/api/v1/nodes—Registered nodes
GET/api/v1/nodes/:address—One node record
PUT/POST/api/v1/nodes/:address/profileneuro:system.nodedescription, website, commission_bps, p2p_endpoint, rpc_endpoint
POST/api/v1/nodes/:address/unjailneuro:system.nodeRe-enter the set after the jail period (owner signs)
POST/api/v1/nft/transferthe NFT addressnft_address, from (current owner), to, + signed fields. Fee 100 uNRO
GET/api/v1/nft/:address—NFT record and transfer history
GET/api/v1/nft/owner/:address—NFTs owned by an address
POST/api/v1/agents/registerneuro:system.agentname, owner, + signed fields. Registers a .agent
GET/api/v1/agents/:address—Agent record

Staking ​

MethodPathSigns forBody / notes
POST/api/v1/staking/stakeneuro:system.stakeaddress, amount, + signed fields
POST/api/v1/staking/unstakeneuro:system.stakeaddress, + signed fields
POST/api/v1/staking/delegatethe validator addressdelegator, validator, amount, + signed fields
POST/api/v1/staking/undelegatethe validator addressdelegator, validator, + signed fields
GET/api/v1/staking/info/:address—Stake, lock, rewards of an address
GET/api/v1/staking/validators—Validators with stake and delegations
GET/api/v1/staking/delegations/:validator—Delegations to a validator
GET/api/v1/staking/my-delegations/:address—Delegations made by an address
GET/api/v1/staking/rewards/:address—Reward history; `source=stake
GET/api/v1/validators—Consensus validators with stake, trust_score, blocks_proposed, votes_cast, last_active
GET/api/v1/slashing/history—Node only. Slashes. limit

See Staking & delegation.

Governance ​

MethodPathSigns forBody / notes
POST/api/v1/governance/proposeneuro:system.governanceproposer, title, description, kind (text / PARAM_CHANGE), payload, voting_duration, + signed fields
POST/api/v1/governance/:id/voteneuro:system.governancevoter, accept (bool), + signed fields
GET/api/v1/governance/proposals—status, limit (≤ 100), offset
GET/api/v1/governance/:id—One proposal with votes
GET/api/v1/governance/params—Every parameter with value and description

See Governance.

Vaults (multi-signature) ​

MethodPathSigns forBody / notes
GET/api/v1/vault/:addr/config—threshold, members
GET/api/v1/vault/:addr/proposals—Payout proposals
GET/api/v1/vault/member/:addr—Vaults an address belongs to
POST/api/v1/vault/:addr/proposalsthe vault addressproposer, to, amount, description, + signed fields
POST/api/v1/vault/:addr/proposals/:id/signthe vault addresssigner, + signed fields. Pays out when signatures reach the threshold
POST/api/v1/vault/:addr/membersthe vault addressmember, requester, + signed fields
POST/api/v1/vault/:addr/thresholdthe vault addressthreshold, requester, + signed fields

Experimental

Vault operations are currently applied by the node that receives the request, not in consensus. Use a single node for a vault until this moves into consensus.

Contracts ​

MethodPathSigns forBody / notes
GET/api/v1/contracts—owner, limit, offset
GET/api/v1/contracts/:address—Metadata, security_score, owner, code hash
GET/api/v1/contracts/:address/token-info—Gateway only. NRC-20 name, symbol, decimals, supply
POST/api/v1/contracts/:address/call—function, args, dry_run, gas_limit, caller. Read with dry_run: true; writes refused on mainnet
POST/api/v1/contracts/deployneuro:system.deployNode only. owner, bytecode_hex or base64_wasm, name, description, template, + signed fields
POST/api/v1/contracts/analyze—Node only. bytecode_hex → risk_score, security_score, ml_score, model, violations
POST/api/v1/contracts/attest—bytecode_hex → analysis signed with ML-DSA-65: score, bytecode_hash, timestamp, signature, pubkey
POST/api/v1/contracts/audit—Gateway only. bytecode_hex → node analysis (source code is not accepted)
POST/api/v1/contracts/reaudit—Gateway only. address → re-run analysis of a deployed contract
POST/api/v1/contracts/generate—Gateway only. Contract template generation (SmartForge)
POST/api/v1/contracts/certifyneuro:system.certIssue a security certificate (VMGuardian operator)
POST/api/v1/contracts/whitelistneuro:system.whitelistNode only. bytecode_hash — trusted template bytecode
PATCH/api/v1/contracts/:address/scoreneuro:system.scoreNode only. security_score
GET/api/v1/certificates—owner, limit, offset
GET/api/v1/certificates/:id—One certificate
GET/api/v1/certificates/contract/:address—Certificate of a contract
GET/api/v1/templates—Registered contract templates
GET/api/v1/templates/:id—One template with ABI
POST/api/v1/templates/registerneuro:system.templatesauthor (a .node), name, description, category, bytecode_hex, abi_json, fee_unro, + signed fields
POST/api/v1/templates/deprecateneuro:system.templatesNode only. template_id, author, delete, + signed fields

AI and models ​

MethodPathNotes
GET/api/v1/ai/statusGateway only. Status of the AI models
POST/api/v1/sentinel/scoreScore a transaction shape: value, gas_price, nonce, last_nonce, balance, tx_count_last_10, recipient_tx_count, is_self_transfer → score, anomalous, category
GET/api/v1/oracle/logAI decision log. model, kind, subject, limit, offset
GET/api/v1/oracle/log/:idOne decision
GET/api/v1/models/registryOn-chain model registry. limit, offset
GET/api/v1/models/registry/:idOne model version
POST/api/v1/models/registerValidators only; signs for neuro:models.registry. from, name, version, weights_hash, architecture, params_count, accuracy, + signed fields
GET/api/v1/ai/export/{blocks,txs,validators,oracle}Training-data export (JSON Lines)
POST/api/v1/assistant/ask, GET /api/v1/assistant/healthGateway only. Documentation assistant (off unless ASSISTANT_ENABLED=1)

Sentinel trust list ​

MethodPathSigns forBody
POST/api/v1/trust/addneuro:system.trustowner, recipient, + signed fields
POST/api/v1/trust/removeneuro:system.trustowner, recipient, + signed fields
GET/api/v1/trust/:owner—Trusted recipients, with activation height

Account abstraction ​

MethodPathSigns forBody
POST/api/v1/session/grantneuro:system.sessionaccount, session_pk, scope, cap, expiry_block, + signed fields
POST/api/v1/session/revokeneuro:system.sessionaccount, session_pk, + signed fields
GET/api/v1/session/list/:account—Session keys of an account
POST/api/v1/sponsor/depositneuro:system.sponsoraddress, amount, + signed fields
POST/api/v1/sponsor/withdrawneuro:system.sponsoraddress, amount, + signed fields
GET/api/v1/sponsor/:address—Sponsor pool balance

See Account abstraction.

Identity and recovery ​

These sign their own messages (for example nc-rotate|addr|add|remove|nonce) rather than nc-tx-v2; see Identity.

MethodPathBody
POST/api/v1/identity/rotateowner, add, remove, + signed fields
POST/api/v1/identity/recovery/setupowner, guardians, threshold, timelock, + signed fields
POST/api/v1/identity/recovery/requesttarget, new_key, + signed fields
POST/api/v1/identity/recovery/approvetarget, guardian, + signed fields
POST/api/v1/identity/recovery/rejecttarget, guardian, + signed fields
POST/api/v1/identity/recovery/withdrawtarget, + signed fields
POST/api/v1/identity/recovery/cancelowner, + signed fields
GET/api/v1/identity/:addrKeys and version
GET/api/v1/identity/recovery/:addrRecovery configuration and any open request
GET/api/v1/identity/guardian-of/:addrIdentities this address guards

Native assets and exchange ​

MethodPathBody / notes
GET/api/v1/assetsIssued assets
GET/api/v1/assets/:idOne asset
GET/api/v1/assets/check-symbol?symbol= — is the ticker free and valid
GET/api/v1/assets/balances/:addrAsset balances
POST/api/v1/assets/issuefrom, name, symbol, decimals, initial, max_supply, reissuable, reissue_unlock_height, issue_nonce, + signed fields. Fee asset_issue_fee
POST/api/v1/assets/transferfrom, to, asset_id, amount, + signed fields
GET/api/v1/dex/pools, /api/v1/dex/pools/:idPools
POST/api/v1/dex/poolsfrom, asset_x, asset_y, amount_x, amount_y, + signed fields
POST/api/v1/dex/liquidity/addfrom, pool_id, max_a, max_b, + signed fields
POST/api/v1/dex/liquidity/removefrom, pool_id, shares, + signed fields
GET/api/v1/dex/quoteSwap quote
POST/api/v1/dex/swapfrom, pool_id, asset_in, amount_in, min_out, deadline_height, + signed fields. Cleared in a batch when the next block commits
GET/api/v1/dex/windowCurrent batch window
POST/api/v1/dex/deposit, /api/v1/dex/withdrawMove funds between the main balance and the exchange balance
GET/api/v1/dex/balances/:addr, /dex/positions/:addr, /dex/activity/:addr, /dex/transactionsExchange balances, LP positions, activity

All asset and exchange operations sign for neuro:system.assets and are applied in consensus.

Test networks only for now

In consensus, these operations also require a second signature over the exact payload (_psig, message nc-asset-op-v1|op|from|fields|nonce) when the node runs with CHAIN_ENV=mainnet. The REST endpoints do not accept that signature yet, so on mainnet every asset and exchange operation is refused; on CHAIN_ENV=testnet they apply without the payload check.

IBC v2 experimental ​

MethodPathBody / notes
POST/api/v1/ibc/channel/openfrom, channel, port, counterparty_chain, allowed_denoms, + signed fields
POST/api/v1/ibc/channel/pausefrom, channel, paused, + signed fields
POST/api/v1/ibc/transferfrom, channel, dest_chain, receiver, denom, amount, + signed fields
POST/api/v1/ibc/recvfrom, packet_id, receiver, denom, amount, + signed fields
POST/api/v1/ibc/ackfrom, id, + signed fields
POST/api/v1/ibc/redeemfrom, channel, dest_chain, receiver, denom, amount, + signed fields
POST/api/v1/ibc/client/update, /api/v1/ibc/attestLight-client update and attestation (relayer)
GET/api/v1/ibc/channels, /ibc/packets, /ibc/denoms, /ibc/client/:chainId, /ibc/header/latest, /ibc/voucher/:addr, /ibc/pq/test-vectorState and test vectors

All IBC v2 operations sign for neuro:system.ibc; recv, ack, channel and client operations are limited to IBC operator keys. See IBC v2 & sharding.