- Tax and accounting: link the two legs of a cross-chain swap so cost basis carries across.
destination.timeis 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:
Example Response
Example Response
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 assource 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.Example Response (Abbreviated, Illustrative Dates)
Example Response (Abbreviated, Illustrative Dates)
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.
Recommended Integration
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.