Skip to main content
A cross-chain transfer has two transactions on two networks: one sends the funds, the other delivers them. The cross-chain lookup takes a hash from either one and returns both legs, with what was sent and what was actually delivered. The coverage endpoint tells you which protocols and networks the lookup can answer for. Typical uses:
  • Tax and accounting: link the two legs of a cross-chain swap so cost basis carries across. destination.time is when the new asset was acquired.
  • Exchanges and custodians: find the origin network and sender of a deposit.
  • Compliance: follow funds across a bridge.
  • Wallets and support: check the status of a user’s transfer.
You’ll need an API key. Pass it as Authorization: Bearer YOUR_API_KEY to https://api.range.org, as in the Quickstart. Both endpoints are part of the Data API.

1. Look Up a Transfer by Either Hash

Get cross-chain transfers by hash takes one path parameter, tx_hash. No network, protocol or direction is needed. This example uses the delivery hash of an Across transfer from Base to Ink:
The send hash, 0x9539f73f932974f9c1cc50658324a3007850ca8b944570f21038d07937e36175, returns the same transfer with matched_leg set to source.

Key Response Fields

Any destination field is null while it is not known. destination itself is null when nothing is known about where the funds land, for example an UNPAIRED deposit.

Circle Gateway Deposits

For Circle Gateway, the hash of the deposit into Gateway also works. It returns the transfers that deposit funded, matched as source and listed in funding_deposit_tx_hashes; source.tx_hash is still the transfer’s own burn. While a deposit is not wholly linked to transfers, the answer also holds a DEPOSITED item for the deposit itself: its source leg is the deposit and its destination is null. Its gateway_deposit.state is unspent, partly_linked, withdrawn or unlinked, and gateway_deposit.reason says why an unlinked deposit cannot be tied to a transfer. DEPOSITED items appear only in this lookup, never in GET /v2/transfers, and coverage does not count them. EVM hashes match in any letter case. Hashes on other networks match exactly as the chain shows them. Nearly every hash belongs to one transfer. An IBC relayer transaction can deliver many transfers under one hash; follow meta.next_cursor until it is null to read them all:

2. Check Coverage

Get cross-chain coverage takes no parameters. It lists every protocol the lookup can return and the networks it is indexed on, as a source or a destination.
Coverage is read from the same index as the lookup, so the two always agree. It refreshes every 10 minutes. Protocol and network pairs with only a handful of records are left out. Coverage lists networks, not contract addresses. On solver-based protocols such as Relay, the delivery is paid from a solver’s own wallet and does not touch the protocol’s contract, so a filter on contract addresses skips delivery hashes. Send every unlinked hash on a covered network: a miss costs one call and returns an empty items.

Statuses

Treat any status not listed here as unsettled.

Errors

The 503 body:

When to Use GET /v2/transfers Instead

Get token transfers (GET /v2/transfers?tx_hash=) is the general transfer search: it filters by address, network, date and more, paginates and returns any transfer. Use the cross-chain lookup when you hold one hash of a bridge or cross-chain swap and need the other leg and what was actually delivered.
1

Load coverage

Call GET /v2/cross-chain/coverage and keep the result. It refreshes every 10 minutes, so calling it more often returns the same answer.
2

Look up every unlinked hash on a covered network

Call GET /v2/cross-chain/transfers/by-hash/{tx_hash}. Do not pre-filter by contract address.
3

Read the counterpart

Use matched_leg to find the other leg. Read destination.asset for what was delivered and destination.time for when. If meta.next_cursor is set, fetch the next page before matching: the transfer you need may be on it.
4

Retry unsettled transfers

For PENDING or UNPAIRED, look the hash up again later. Lookups may be served from cache for up to 60 seconds.
5

Explain an empty result

Compare the transaction with coverage. If its network is not listed, or it is older than covered_from, it is outside coverage. If it is newer than indexed_through, look it up again later. Otherwise, the index holds no cross-chain transfer for it.

Reference

Get cross-chain transfers by hash

Full parameter and response schema for the lookup.

Get cross-chain coverage

Full response schema for coverage.
Last modified on October 28, 2026