ZENANET DocsBeta
RPC & Contracts

REST API Reference

Cosmos REST endpoints for transactions, address history, balances, token pairs, blocks, and ZENANET modules

The ZENANET HTTP API is the Cosmos SDK REST server (gRPC-Gateway). It exposes the Cosmos-native side of the chain: native transactions, per-address transaction history, bank balances in every denom, and the ZENANET EVM modules. Click any row to expand its parameters and examples.

For 0x transaction hashes, ERC-20 logs, blocks, and contract calls, use the JSON-RPC Reference instead.

Base URLHost
Mainnet RESThttps://api.zena-ai.io
Testnet RESThttps://api-testnet.zena-ai.io
Mainnet CometBFT RPChttps://rpc.zena-ai.io

All endpoints are plain GET requests that return JSON. Browser GET calls need no CORS preflight.

Explorer-style routes such as /transactions, /token-transfers, or /search belong to the Blockscout API v2, not to the node. Everything below is served by the node itself.

Transactions

Cosmos transactions use a 64-character HEX hash without 0x. EVM transactions are wrapped in MsgEthereumTx, so they can be found here too, and the ethereum_tx event carries their 0x hash.

GET/cosmos/tx/v1beta1/txs/{hash}Transaction by Cosmos hashapi.zena-ai.io

Works for native messages such as MsgSend, staking, governance, and IBC. EVM transactions are returned as MsgEthereumTx, with the EVM hash in tx_response.events under the ethereum_tx event.

Parameters

NameInDescription
hashrequiredpath64-character HEX hash, no 0x prefix

Request

curl -s 'https://api.zena-ai.io/cosmos/tx/v1beta1/txs/<COSMOS_TX_HASH>'

Response (main fields)

{
  "tx": { "body": { "messages": [
    { "@type": "/cosmos.bank.v1beta1.MsgSend", "from_address": "zenanet1…", "to_address": "zenanet1…",
      "amount": [ { "denom": "aznnt", "amount": "1000000000000000000" } ] }
  ] } },
  "tx_response": {
    "height": "6699", "txhash": "ABCD…", "code": 0, "gas_used": "68000",
    "events": [
      { "type": "transfer", "attributes": [
        { "key": "recipient", "value": "zenanet1…" }, { "key": "sender", "value": "zenanet1…" },
        { "key": "amount", "value": "1000000000000000000aznnt" } ] }
    ]
  }
}
GET/cosmos/tx/v1beta1/txs?query=…Search transactions by event (address history, hash mapping)api.zena-ai.io

The one search endpoint behind address history, EVM-hash to Cosmos-tx mapping, and message-type filters.

ZENANET runs Cosmos SDK v0.53. The older events= parameter is not accepted. Use query= with limit and page for pagination. Verified against mainnet.

Parameters

NameInDescription
queryrequiredqueryEvent condition type.attr='value'. Encode the quotes as %27. Join several conditions with ' AND '. Examples: message.sender='0x…' (lowercase), ethereum_tx.recipient='0x…' (checksum), ethereum_tx.ethereumTxHash='0x…', transfer.recipient='zenanet1…', message.module='evm', message.action='/cosmos.bank.v1beta1.MsgSend'
order_byqueryORDER_BY_ASC or ORDER_BY_DESC
limitqueryPage size
pagequeryPage number, starting at 1

Request

# transactions sent by an EVM address (lowercase hex)
curl -s 'https://api.zena-ai.io/cosmos/tx/v1beta1/txs?query=message.sender=%270x6dec67752a81d8d0bff69b7c9154441301015d97%27&order_by=ORDER_BY_DESC&limit=20'

# find the Cosmos tx for an EVM hash
curl -s 'https://api.zena-ai.io/cosmos/tx/v1beta1/txs?query=ethereum_tx.ethereumTxHash=%270x<evm_txhash>%27'

# native MsgSend transfers received by a bech32 address
curl -s 'https://api.zena-ai.io/cosmos/tx/v1beta1/txs?query=transfer.recipient=%27zenanet1...%27&order_by=ORDER_BY_DESC&limit=50'

Response (main fields)

{
  "tx_responses": [ {
    "height": "8746210", "txhash": "D63BB02B…", "code": 0, "gas_used": "21000",
    "events": [
      { "type": "ethereum_tx", "attributes": [
        { "key": "ethereumTxHash", "value": "0xb1412ed9…" }, { "key": "recipient", "value": "0x6f1C9368…" },
        { "key": "amount", "value": "60000000000000000000000" }, { "key": "txGasUsed", "value": "21000" } ] },
      { "type": "message", "attributes": [
        { "key": "module", "value": "evm" }, { "key": "sender", "value": "0x6dec6775…" }, { "key": "txType", "value": "0" } ] }
    ] } ],
  "total": "6"
}
GETEVM transactions by address · message.sender / ethereum_tx.recipientAll EVM transactions sent or received by one addressapi.zena-ai.io

JSON-RPC has no method that lists the transactions of an address, so use this search. recipient is the transaction's to field, so for contract calls it is the contract address. To see tokens received by a wallet, use eth_getLogs with topics[2] instead.

Parameters

NameInDescription
queryrequiredquerySent: message.sender='0x<lowercase>'. Received: ethereum_tx.recipient='0x<Checksum>' (EIP-55, case-sensitive)
order_byqueryORDER_BY_DESC for newest first
limit / pagequeryPagination

Request

curl -s 'https://api.zena-ai.io/cosmos/tx/v1beta1/txs?query=ethereum_tx.recipient=%270x6f1C93682B5342B4F2c8102243710F8B00C89a21%27&order_by=ORDER_BY_DESC&limit=20'

Response (main fields)

Same shape as the search above. Read ethereumTxHash from the ethereum_tx event and pass it to eth_getTransactionReceipt for full details.

Token Pairs

GET/cosmos/evm/erc20/v1/token_pairsRegistered denom to ERC-20 mappingsapi.zena-ai.io

Shows which ERC-20 address exposes the native coin and each IBC token. Any address listed here can be used as address in eth_getLogs.

Parameters

NameInDescription
pagination.limitqueryPage size

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/erc20/v1/token_pairs'

Response (main fields)

{ "token_pairs": [ { "erc20_address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "denom": "aznnt", "enabled": true, "contract_owner": "OWNER_MODULE" } ],
  "pagination": { "total": "1" } }
GET/cosmos/evm/erc20/v1/token_pairs/{token}Single token pairapi.zena-ai.io

Parameters

NameInDescription
tokenrequiredpathERC-20 address or denom (aznnt, ibc/…)

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/erc20/v1/token_pairs/aznnt'

Response (main fields)

{ "token_pair": { "erc20_address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "denom": "aznnt", "enabled": true, "contract_owner": "OWNER_MODULE" } }

Blocks

GET/cosmos/base/tendermint/v1beta1/blocks/{height}Cosmos block with consensus dataapi.zena-ai.io

Includes CometBFT details such as validator signatures and the proposer.

Parameters

NameInDescription
heightrequiredpathBlock height, or latest

Request

curl -s 'https://api.zena-ai.io/cosmos/base/tendermint/v1beta1/blocks/latest'
curl -s 'https://api.zena-ai.io/cosmos/base/tendermint/v1beta1/blocks/4096'

Response (main fields)

{ "block_id": { "hash": "…" },
  "block": { "header": { "chain_id": "zena_15150-1", "height": "6699", "time": "…", "proposer_address": "…" },
             "data": { "txs": [ "base64…" ] }, "last_commit": { "signatures": [] } } }
GET/cosmos/base/tendermint/v1beta1/node_infoNode and application versionapi.zena-ai.io

No parameters.

Request

curl -s 'https://api.zena-ai.io/cosmos/base/tendermint/v1beta1/node_info'

Response (main fields)

{ "default_node_info": { "network": "zena_15150-1", "moniker": "…", "version": "…" },
  "application_version": { "name": "zena", "app_name": "zenad", "version": "…", "cosmos_sdk_version": "v0.53.x" } }

Accounts and Balances

The same key is 0x… on the EVM side and zenanet1… on the Cosmos side. Convert with zenad debug addr <address>.

GET/cosmos/bank/v1beta1/balances/{address}All denoms held by a bech32 addressapi.zena-ai.io

Returns aznnt plus IBC tokens and any other denom.

Parameters

NameInDescription
addressrequiredpathzenanet1… address

Request

curl -s 'https://api.zena-ai.io/cosmos/bank/v1beta1/balances/zenanet1...'

Response (main fields)

{ "balances": [ { "denom": "aznnt", "amount": "1000000000000000000" } ], "pagination": { "total": "1" } }
GET/cosmos/evm/vm/v1/balances/{address}Cosmos balances by hex address (ZENANET extension)api.zena-ai.io

Same data as the bank query, without converting to bech32 first.

Parameters

NameInDescription
addressrequiredpath0x address

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/balances/0x<address>'

Response (main fields)

{ "balances": [ { "denom": "aznnt", "amount": "1000000000000000000" } ] }
GET/cosmos/evm/vm/v1/account/{address}EVM account: balance, nonce, code hashapi.zena-ai.io

Parameters

NameInDescription
addressrequiredpath0x address

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/account/0x<address>'

Response (main fields)

{ "balance": "1000000000000000000", "code_hash": "0xc5d2…", "nonce": "7" }
GET/cosmos/evm/vm/v1/cosmos_account/{address}Hex address to Cosmos account infoapi.zena-ai.io

Returns the bech32 address, sequence (nonce), and account_number.

Parameters

NameInDescription
addressrequiredpath0x address

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/cosmos_account/0x<address>'

Response (main fields)

{ "cosmos_address": "zenanet1…", "sequence": "7", "account_number": "12" }
GET/cosmos/evm/vm/v1/codes/{address}Contract bytecodeapi.zena-ai.io

Parameters

NameInDescription
addressrequiredpath0x contract address

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/codes/0x<contract>'

Response (main fields)

{ "code": "YIBgQFI…" }

Base64-encoded bytecode.

GET/cosmos/evm/vm/v1/storage/{address}/{key}Storage slotapi.zena-ai.io

Parameters

NameInDescription
addressrequiredpath0x contract address
keyrequiredpathHex storage key

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/storage/0x<contract>/0x0'

Response (main fields)

{ "value": "0x0000000000000000000000000000000000000000000000000000000000000000" }

Chain and Fees

GET/cosmos/evm/feemarket/v1/base_feeCurrent base fee (aznnt)api.zena-ai.io

No parameters.

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/feemarket/v1/base_fee'

Response (main fields)

{ "base_fee": "1000000000" }
GET/cosmos/evm/feemarket/v1/block_gasGas used in the previous blockapi.zena-ai.io

No parameters.

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/feemarket/v1/block_gas'

Response (main fields)

{ "gas": "21000" }
GET/cosmos/evm/vm/v1/paramsEVM module parametersapi.zena-ai.io

No parameters. Includes evm_denom, the active precompile list, and allowed transaction types.

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/params'

Response (main fields)

{ "params": { "evm_denom": "aznnt", "extra_eips": [],
  "active_static_precompiles": ["0x0000000000000000000000000000000000000400", "0x0000000000000000000000000000000000000800"],
  "allow_unprotected_txs": false } }
GET/cosmos/evm/vm/v1/configChain configuration (EIP activation blocks)api.zena-ai.io

No parameters.

Request

curl -s 'https://api.zena-ai.io/cosmos/evm/vm/v1/config'

Response (main fields)

{ "config": { "chain_id": "15150", "homestead_block": "0", "london_block": "0" } }

Calling from a Browser

On the public mainnet hosts the reverse proxy handles TLS and CORS, so browser GET requests work as-is:

const balances = await fetch(
  "https://api.zena-ai.io/cosmos/bank/v1beta1/balances/zenanet1..."
).then((r) => r.json());

GET requests do not trigger a CORS preflight. If you POST (for example to /cosmos/tx/v1beta1/simulate), the proxy must answer OPTIONS with 204. Self-hosted nodes need [api] enabled-unsafe-cors = true in app.toml.

On this page