Skip to content
0%

Introducing the Multichain Transfers API (Beta)

Author: Alchemy

Last updated: November 4, 20263 min read
Alchemy Multichain Transfers API (Beta)

Wallets and portfolio apps are one of the fastest-growing categories onchain. The crypto wallet market is on track to grow from $15.5B in 2025 to $100.8B by 2033, a 26.6% CAGR. We're proud to help leading wallets like Zerion, Rainbow, Phantom, Trust Wallet, and Coinbase Wallet power their transfer history and balance tracking.

One of the most used methods for these teams is alchemy_getAssetTransfers. Tens of thousands of teams called it in the last 30 days, making it the #2 most-used Data API by request volume. Teams use it to pull a wallet's native, ERC-20, ERC-721, and ERC-1155 transfer history and power activity feeds, balance tracking, and portfolio views.

Today, we're upgrading that experience: the Multichain Transfers API returns a single wallet's transfer history across up to 5 networks in one call, already merged and ordered by time.

It's live in beta now: try it yourself.

One call, multiple chains

Today, calling alchemy_getAssetTransfers gets you one network per request. Scaling to more chains means multiplying calls, merging the results yourself, and deciding what to do when one network is slow or comes back with an error.

So we upgraded it. Four key upgrades in our Multichain Transfers API:

  • Multichain in one call. Pass a list of networks and get back one list, ordered by blockTimestamp.
  • Query in both directions at once. Set direction to to, from, or both and get incoming and outgoing transfers together.
  • Time-based filtering. Filter by fromTimestamp and toTimestamp instead of block numbers, and sort results by blockTimestamp with order (asc or desc).
  • A cleaner response shape. Token amounts live under fungible, NFT data under nfts, blockTimestamp is always at the top level, and so is contractAddress for token and NFT transfers.

If one of the networks you asked for doesn't return a result, the call still comes back with a 200 and everything that did load, plus an error.partialErrors array naming what failed.

Try it

bash
Copied
curl --request POST \ --url https://api.g.alchemy.com/data/v1/YOUR_API_KEY/transfers/by-address \ --header 'Content-Type: application/json' \ --data '{ "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "direction": "both", "networks": ["eth-mainnet", "base-mainnet", "matic-mainnet"], "fromTimestamp": "2026-08-01T00:00:00Z", "toTimestamp": "2026-08-06T00:00:00Z", "category": ["external", "erc20", "erc721", "erc1155"], "order": "desc", "maxCount": 100 }'

The response is one transfers array spanning every network you asked for, newest first, with a pageKey to pull the next page (trimmed for readability):

json
Copied
{ "transfers": [ { "network": "base-mainnet", "blockTimestamp": "2026-08-05T23:58:41Z", "category": "erc20", "from": "0x1f98abcd...", "to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "contractAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "fungible": { "value": 250, "decimals": 6, "asset": "USDC" } }, { "network": "eth-mainnet", "blockTimestamp": "2026-08-05T23:55:12Z", "category": "external", "from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "to": "0x7a250d...", "fungible": { "value": 0.5, "decimals": 18, "asset": "ETH" } } ], "pageKey": "eyJ0cyI6..." }

Native, ERC-20, ERC-721, and ERC-1155 transfers work on all 14 supported networks (11 mainnets and 3 testnets), including Ethereum, Base, Polygon, Arbitrum, Optimism, and BNB Chain (full list). Internal transfers are available on Ethereum, Base, Polygon, and Arc (mainnet and testnet), and special NFTs on Ethereum. We're adding more networks all the time.

One thing to know: category is required, so pass at least one in every request.

Get started

The Multichain Transfers API is now in beta at POST /data/v1/{apiKey}/transfers/by-address. Try it yourself in the docs playground, no signup required. Or swap your own API key into the example above, and migrate your existing getAssetTransfers integration to the new endpoint to drop the per-network loop.

How is this different from alchemy_getAssetTransfers?

getAssetTransfers returns transfers for one network per call. The Multichain Transfers API takes a list of up to 5 networks and returns one merged, time-ordered list, in either or both directions, in a single request.

What happens if one network fails?

You still get a 200 response with every transfer that loaded successfully, plus an error.partialErrors array listing which networks or categories didn't come back. Nothing fails silently and nothing blocks on the slowest network.

Alchemy Newsletter

Be the first to know about releases

Sign up for our newsletter

Get the latest product updates and resources from Alchemy

A
O
D
+
Over 80,000 subscribers

By entering your email address, you agree to receive our marketing communications and product updates. You acknowledge that Alchemy processes the information we receive in accordance with our Privacy Notice. You can unsubscribe anytime.