Cronos IBC Bridge Activity API
A guide for querying IBC transfers between Cronos POS (crypto-org-chain-mainnet-1), Cronos EVM (cronosmainnet_25-1), and other supported Cosmos chains via the public Cronos bridge-indexer API.
Base URL & Authentication
Auth: none (public endpoint)
What this API covers
IBC transfers between supported chains, indexed end-to-end: source chain transaction, destination chain transaction, amount, denom, status.
Includes the
x/cronosauto-conversion from IBC voucher to native basecro on the EVM side. The API reports the logical transfer as a single activity even though on-chain, it involves two-stage transfers.
Does NOT cover:
Cosmos-side MsgSend transfers within a single chain
Ethereum <-> Cronos Gravity Bridge deposits/withdrawals
Smart-contract internal transfers on the EVM side
Fee payments, staking rewards, module-account sweeps
For those flows you need to parse block_results events directly (see Cosmos SDK documentation on transfer events coin_received and coin_spent ).
Supported networks and address formats
Cronos EVM
cronosevm
Ethereum hex (0x...)
0x
Cronos EVM (Cosmos)
cronos
Bech32 with HRP crc
crc1...
Cronos POS
cryptoorgchain
Bech32 with HRP cro
cro1...
Cosmos Hub
cosmoshub
Bech32 with HRP cosmos
cosmos1...
Other IBC-connected chains
(others)
Chain-specific bech32 HRP
varies
IMPORTANT:
Passing the wrong address format for a given network returns {"result": [], "pagination": {...}} with no error, just an empty result set.
This is the most common reason you will think an address has no IBC activity when it actually does.
Converting between address formats
cronosevm and cronos refer to the same underlying account, just expressed differently.
To convert:
Or programmatically: take the 20-byte raw address and bech32-encode with HRP crc (testnet: tcrc); Cronos POS addresses use HRP cro (testnet: tcro).
Always lowercase addresses before passing them to the API.
Endpoints
Global activities
GET
/bridges/activitiesFull Path:
https://cronos.org/indexing/api/v1/bridges/activities
Returns IBC activities across all addresses. Filter to one address using the cronosAddress (crc1... address) query parameter.
Per-account activities
GET
/bridges/{network}/account/{account}/activitiesFull Path:
https://cronos.org/indexing/api/v1/bridges/{network}/account/{account}/activities
Scope queries to a specific account on a specific chain.
{network}must be one of:cronosevm,cronos,cryptoorgchain,cosmoshub, or other supported chain slug.{account}must be in the address format matching the network
See Supported networks and address formats for parameter details.
Examples:
Transaction lookup
GET
/bridges/txs/{hash}Full URL Path:
https://cronos.org/indexing/api/v1/bridges/txs/{hash}
Returns a single activity by source or destination transaction hash. Use when you know the transaction hash but need the paired cross-chain context.
Query parameters
order
sourceBlockTime.desc or sourceBlockHeight.desc
Default is ASC. Only .desc accepted; .asc returns error. Omit for ascending.
status
pending, cancelled, counterparty_confirmed, failed_on_chain, counterparty_rejected
Lowercase
id.gt
Integer
Cursor-based pagination: records with id > value
createdAt.lt
RFC3339 timestamp
Created before
createdAt.gt
RFC3339 timestamp
Created after
createdAt.ago
Go duration e.g. 24h, 7d
Created before now minus duration
updatedAt.gt
RFC3339 timestamp
Updated after
sourceBlockTime.lt
RFC3339 timestamp
Source block range filter: before
sourceBlockTime.gt
RFC3339 timestamp
Source block range filter: after
sourceBlockTime.ago
Go duration e.g. 24h, 7d
Source block range filter: before now minus duration
destinationBlockTime.gt
RFC3339 timestamp
Destination block after
pagination.limit
Integer
Default 20, max 100
pagination.page
Integer
1-indexed
Response schema
Identifying direction
Direction from the perspective of Cronos EVM is determined by sourceChain and destinationChain:
Inbound to Cronos EVM
(Cronos POS -> Cronos EVM)
sourceChain == "Crypto.org-Chain" AND destinationChain == "Cronos"
Outbound from Cronos EVM
(Cronos EVM -> Cronos POS)
sourceChain == "Cronos" AND destinationChain == "Crypto.org-Chain"
When filtering by a Cronos-side address, it appears in:
destinationAddressfor inbound recordssourceAddressfor outbound records
Amount interpretation
amount: raw on-chain amount in the smallest unit of the source chaindenom: source-chain denom (e.g. basecro)displayAmount: human-readable amount divided by the correct decimal factordisplayDenom: user-facing ticker (e.g. CRO)
Note the decimal mismatch: Cronos POS uses 8-decimal basecro (1 CRO = 10⁸ basecro), while Cronos EVM uses 18-decimal basecro (1 CRO = 10¹⁸ basecro). The API reports the source-side raw amount in amount. For a Cronos POS→Cronos EVM transfer of 10 CRO, amount will be 1000000000 (10 × 10⁸), while the balance credited on CEVM is 10000000000000000000 (10 × 10¹⁸) after x/cronos auto-conversion.
Status values
Pending
Source tx submitted, destination not yet delivered
CounterpartyConfirmed
Packet successfully delivered on destination (normal success state
CounterpartyRejected
Destination rejected the packet (rare; usually denom/channel mismatch)
FailedOnChain
Source transaction failed
Cancelled
User/relayer cancelled before delivery
For balance reconciliation, only CounterpartyConfirmed inbound records should be credited.
Worked example
Cronos EVM Address: 0x582f7c906f15f6fe913f890fd4d11e07ae3b4468
Option A - query by hex address via cronosevm:
Option B - convert to bech32 first, then query via cronos:
Both return the same 4 records, all inbound from Cronos POS:
840
3,121,648
2021-11-08 02:17:16
10 CRO
869
3,121,677
2021-11-08 02:19:56
20 CRO
1,524
3,122,266
2021-11-08 03:20:05
1,000 CRO
4,103
3,124,582
2021-11-08 07:17:02
100 CRO
Direct cross-check: cronosd q bank balances crc1tqhheyr0zhm0ayfl3y8af5g7q7hrk3rgs7lwya --height 840 returns 10000000000000000000 basecro (= 10 CRO), matching the first activity's displayAmount.
Common query recipes
All inbound IBC transfers to a Cronos EVM address in a date range:
Last 24h of bridge activity, all addresses:
Pending transfers for a Cronos POS address:
Paginate all history for an address (Python):
Gotchas and limitations
Address format must match the network slug:
cronosevmexpects0xhex;cronosexpectscrc1bech32;cryptoorgchainexpectscro1bech32;cosmoshubexpectscosmos1bech32. Wrong format returns empty results with no error.cronosevmandcronosare the same account: two representations of the same Cronos EVM address. Either can be used; pick whichever you already have on hand.Order param: only
.descis accepted. Omit the param entirely for ascending order.Decimal mismatch: amount is in source-chain units. For Cronos POS->Cronos EVM the balance credit on CEVM is 10^10 x amount (Cronos POS uses 8-decimal basecro; CEVM uses 18-decimal). Always use
displayAmountfor user-facing presentation.No EVM-side tx hash:
destinationTransactionIdis the CometBFT tx hash on Cronos EVM (the IBC MsgRecvPacket), not an EVM transaction hash. There is no EVM tx for IBC receives - they are Cosmos-side operations. As a result, Cronos EVM explorers do not surface these IBC transfers; query them via this API or a Cosmos-side explorer instead.Auto-conversion is implicit: the record shows the logical transfer but does not expose the two-stage
x/cronosconversion. Balance reconciliation should credit the destination address in native basecro (18-decimal on Cronos EVM) even though on-chain there is a transient IBC voucher.Rate limits: not documented. Treat as reasonable use
- paginateatlimit=100and avoid parallel bulk pulls.Bridges only: native Cosmos MsgSend, Gravity Bridge, and smart-contract transfers are not covered by this API.
Last updated
Was this helpful?