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 URL | Host |
|---|---|
| Mainnet REST | https://api.zena-ai.io |
| Testnet REST | https://api-testnet.zena-ai.io |
| Mainnet CometBFT RPC | https://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
| Name | In | Description |
|---|---|---|
hashrequired | path | 64-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
| Name | In | Description |
|---|---|---|
queryrequired | query | Event 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_by | query | ORDER_BY_ASC or ORDER_BY_DESC |
limit | query | Page size |
page | query | Page 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
| Name | In | Description |
|---|---|---|
queryrequired | query | Sent: message.sender='0x<lowercase>'. Received: ethereum_tx.recipient='0x<Checksum>' (EIP-55, case-sensitive) |
order_by | query | ORDER_BY_DESC for newest first |
limit / page | query | Pagination |
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.
GET/tx_searchCometBFT indexer: find the Cosmos tx for an EVM hashrpc.zena-ai.io
Queries the node's indexer directly. This is the same path eth_getTransactionByHash falls back to when enable-indexer is off.
Parameters
| Name | In | Description |
|---|---|---|
queryrequired | query | "ethereum_tx.ethereumTxHash='0x…'" including the double quotes |
prove | query | false |
Request
curl -s 'https://rpc.zena-ai.io/tx_search?query="ethereum_tx.ethereumTxHash=%270x<evm_txhash>%27"'Response (main fields)
{ "result": { "txs": [ { "hash": "ABCD…", "height": "6699", "tx_result": { "code": 0, "gas_used": "21000", "events": [] } } ], "total_count": "1" } }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
| Name | In | Description |
|---|---|---|
pagination.limit | query | Page 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
| Name | In | Description |
|---|---|---|
tokenrequired | path | ERC-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
| Name | In | Description |
|---|---|---|
heightrequired | path | Block 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
| Name | In | Description |
|---|---|---|
addressrequired | path | zenanet1… 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
| Name | In | Description |
|---|---|---|
addressrequired | path | 0x 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
| Name | In | Description |
|---|---|---|
addressrequired | path | 0x 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
| Name | In | Description |
|---|---|---|
addressrequired | path | 0x 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
| Name | In | Description |
|---|---|---|
addressrequired | path | 0x 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
| Name | In | Description |
|---|---|---|
addressrequired | path | 0x contract address |
keyrequired | path | Hex 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.