API Reference
Source Code
The API is designed to be run serverlessly (without storing state) and is a wrapper on top of the SDK. See full implementation here.
Before starting the integration, please ensure that you fill this form and get your integrator ID.
Pick the Correct API for your Use Case
Output
Executable calldata for the transaction
Quote data only (requires dev assembly)
Swap Handling
Full swap-bridge-swap support (any → any)
Only bridgeable → bridgeable
App Fee Handling
Set app fee percentage and recipient using query parameters
Requires extra embedded action to charge fees
Use Cases
Should be default for integrators (wallets, dApps, aggregators)
Niche: teams wanting to control their own swap infra or manage custom swap routing
Caching & Liveness
Users of the Across API are requested to cache results for no longer than 300 seconds.
The Across API serves data that is derived from the on-chain state of the Across contracts and relayer bots. The on-chain state is subject to change each block, and cached data can quickly become invalid as a result.
The exception is the /deposit/status
endpoint which is implemented in this stateful repository because it relies on an indexing solution.
Note: Relayer settlement only happens on mainnet. Relayers on the testnet are funded manually by Risk Labs. Therefore we request developers to test with smaller amounts while bridging using the testnet.
You can retrieve current limits of the protocol on testnet using the /limits
API on the testnet.
A complete testnet experience can be found at the Across Testnet Bridge.
Testnet Across API
Please ensure that you use https://testnet.across.to/api
as the URL to access the endpoints given below on the testnet. You can use the API on testnet for these supported chains.
Testnet fills typically take around 1 minute, significantly slower than mainnet's 2 second fills. This is because testnet lacks the economic incentives and relayer competition that drive mainnet's performance and reliability. We also recommend users to perform relatively smaller deposits (~$10) as relayer settlement does not occur on the testnet and unfilled deposits are not automatically refunded.
Therefore we only recommend you to use testnet API to ensure your implementation of the API is correct and then switch to mainnet API and experience Across in it's true form.
API Endpoints
Bridge and Swap with Swap API
Returns data required to execute a crosschain swap. If the input token requires approval, approvalTxns
will be included in the response.
Defines the type of trade execution strategy used in a swap or bridge request. Each trade type specifies how input and output token amounts are determined and how associated fees are handled. Here are the tradeTypes:
- exactInput: Use this when you want to bridge or swap a fixed amount of your inputToken. You define the exact quantity of tokens to send, and the system calculates the amount of outputToken you'll receive after all fees are deducted. If your input isn't sufficient to cover the transaction fees, the request will fail.
- minOutput: Use this when you need to receive at least a certain amount of the outputToken. You set the minimum output you're willing to accept, and the system calculates the necessary input amount, including fees and slippage. Due to price slippage, the final amount you receive will be at least your specified minimum but could be slightly more. This is especially useful for simple swaps without subsequent crosschain actions.
- exactOutput: Use this when you need to receive a precise amount of the destination token. You specify the exact output you require, and the system calculates the total input needed to guarantee that amount. If market conditions prevent the system from delivering that exact amount, the entire transaction is cancelled, and your funds are refunded. This is recommended for multi-step transactions, like providing an exact amount of an ERC20 token to a minting contract.
exactInput
Possible values: Required amount of output token in smallest unit.
1000000
Address of the input token on the origin chain.
0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85
Address of the output token on the destination chain.
0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
Chain ID of the origin chain.
10
Chain ID of the destination chain.
42161
Address of the depositor initiating the swap.
0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB
Address of the account receiving the output token.
0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB
Enables integrators to collect a customizable fee in the output token, sent to a designated address on the destination chain. appFee is expressed in percentage with value ranging between 0 and 1.
0.01
Address of the account receiving the app fees. Must be defined if you are also defining appFee
.
0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB
2-byte hex-string that identifies the integrator. E.g., "0xdead".
0xdead
Address to receive refunds. Defaults to depositor if not provided.
0xDEPOSITOR_ADDRESS
Specifies whether refund should be sent on the origin chain. Defaults to true.
true
Slippage tolerance percentage (e.g., 1 for 1%, 0.5 for 0.5%).
1
Used to define whether you want to calculate the transaction details (swap) on origin chain.Defaults to false.
true
Used to define whether you want to strictly follow the defined tradeType.Defaults to false.
true
Used to define the sources you want to exclude from the crosschain swap action. Defaults to an empty array.
true
Used to define the sources you want to include from the crosschain swap action. Defaults to an empty array.
true
Swap approval data returned successfully.
Bad request due to invalid input parameter.
Insufficient liquidity for same-asset bridging.
GET /api/swap/approval HTTP/1.1
Host: app.across.to
Accept: */*
{
"crossSwapType": "bridgeableToAny",
"amountType": "exactInput",
"checks": {
"allowance": {
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"spender": "0x6f26Bf09B1C792e3228e5467807a900A503c0281",
"actual": "115792089237316195423570985008687907853269984665640564039457584007913099639935",
"expected": "1000000"
},
"balance": {
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"actual": "7169942",
"expected": "1000000"
}
},
"steps": {
"bridge": {
"inputAmount": "1000000",
"outputAmount": "980662",
"tokenIn": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
},
"tokenOut": {
"decimals": 6,
"symbol": "USDC",
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"chainId": 42161
},
"fees": {
"totalRelay": {
"pct": "19338767572622738",
"total": "19338"
},
"relayerCapital": {
"pct": "100000000000000",
"total": "100"
},
"relayerGas": {
"pct": "19227000000000000",
"total": "19227"
},
"lp": {
"pct": "11767572622738",
"total": "11"
}
}
},
"destinationSwap": {
"tokenIn": {
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"decimals": 6,
"symbol": "USDC",
"chainId": 42161
},
"tokenOut": {
"decimals": 18,
"symbol": "ETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"name": "Ether",
"chainId": 42161
},
"inputAmount": "980662",
"maxInputAmount": "980662",
"outputAmount": "263466241499732",
"minOutputAmount": "260831579075100",
"swapProvider": {
"name": "0x",
"sources": [
"uniswap_v3"
]
}
}
},
"inputToken": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
},
"outputToken": {
"decimals": 18,
"symbol": "ETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"name": "Ether",
"chainId": 42161
},
"refundToken": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
},
"fees": {
"total": {
"amount": "47651",
"amountUsd": "0.047642182071510164",
"pct": "47651283466652296",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"originGas": {
"amount": "134879133226",
"amountUsd": "0.000502067341563801",
"token": {
"chainId": 10,
"address": "0x0000000000000000000000000000000000000000",
"decimals": 18,
"symbol": "ETH"
}
},
"destinationGas": {
"amount": "5161137520505",
"amountUsd": "0.019223327642999999",
"pct": "19227000000000001",
"token": {
"chainId": 42161,
"address": "0x0000000000000000000000000000000000000000",
"decimals": 18,
"symbol": "ETH"
}
},
"relayerCapital": {
"amount": "100",
"amountUsd": "0.0000999809",
"pct": "100000000000000",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"lpFee": {
"amount": "11",
"amountUsd": "0.000010997899",
"pct": "11000000000000",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"relayerTotal": {
"amount": "19338",
"amountUsd": "0.019334306442000002",
"pct": "19338000000000001",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"app": {
"amount": "0",
"amountUsd": "0.0",
"pct": "0",
"token": {
"decimals": 18,
"symbol": "ETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"name": "Ether",
"chainId": 42161
}
}
},
"inputAmount": "1000000",
"expectedOutputAmount": "263466241499732",
"minOutputAmount": "260831579075100",
"expectedFillTime": 3,
"swapTx": {
"simulationSuccess": true,
"chainId": 10,
"to": "0x6f26Bf09B1C792e3228e5467807a900A503c0281",
"data": "0xad5425c6000000000000000000000000a4d353bbc130cbef1811f27ac70989f9d568ceab...",
"gas": "122554",
"maxFeePerGas": "1100569",
"maxPriorityFeePerGas": "1100000"
},
"id": "6pl4c-1754347045980-2353645c0fb7"
}
Use the /swap/approval
API to build embedded crosschain actions (e.g., mint, deposit) that execute on the destination chain immediately after a swap. Define an action with its target
, functionSignature
, and value
. For contract calls, provide an args[]
array where each parameter can be static or dynamically populated with a token balance by setting populateDynamically: true
and specifying the balanceSourceToken
. In this example we will transfer the entire balance of a newly swapped token, call the ERC20 transfer function with a static recipient address and a dynamic amount argument flagged for population.
Defines the type of trade execution strategy used in a swap or bridge request. Each trade type specifies how input and output token amounts are determined and how associated fees are handled. Here are the tradeTypes:
- exactInput: Use this when you want to bridge or swap a fixed amount of your inputToken. You define the exact quantity of tokens to send, and the system calculates the amount of outputToken you'll receive after all fees are deducted. If your input isn't sufficient to cover the transaction fees, the request will fail.
- minOutput: Use this when you need to receive at least a certain amount of the outputToken. You set the minimum output you're willing to accept, and the system calculates the necessary input amount, including fees and slippage. Due to price slippage, the final amount you receive will be at least your specified minimum but could be slightly more. This is especially useful for simple swaps without subsequent crosschain actions.
- exactOutput: Use this when you need to receive a precise amount of the destination token. You specify the exact output you require, and the system calculates the total input needed to guarantee that amount. If market conditions prevent the system from delivering that exact amount, the entire transaction is cancelled, and your funds are refunded. This is recommended for multi-step transactions, like providing an exact amount of an ERC20 token to a minting contract.
exactInput
Possible values: Required amount of output token in smallest unit.
1000000
Address of the input token on the origin chain.
0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85
Address of the output token on the destination chain.
0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
Chain ID of the origin chain.
10
Chain ID of the destination chain.
42161
Address of the depositor initiating the swap.
0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB
Address of the account receiving the output token.
0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB
Enables integrators to collect a customizable fee in the output token, sent to a designated address on the destination chain. appFee is expressed in percentage with value ranging between 0 and 1.
0.01
Address of the account receiving the app fees. Must be defined if you are also defining appFee
.
0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB
2-byte hex-string that identifies the integrator. E.g., "0xdead".
0xdead
Address to receive refunds. Defaults to depositor if not provided.
0xDEPOSITOR_ADDRESS
Specifies whether refund should be sent on the origin chain. Defaults to true.
true
Slippage tolerance percentage (e.g., 1 for 1%, 0.5 for 0.5%).
1
Used to define whether you want to calculate the transaction details (swap) on origin chain.Defaults to false.
true
Used to define whether you want to strictly follow the defined tradeType.Defaults to false.
true
Used to define the sources you want to exclude from the crosschain swap action. Defaults to an empty array.
true
Used to define the sources you want to include from the crosschain swap action. Defaults to an empty array.
true
Swap approval data returned successfully.
Bad request due to invalid input parameter.
Insufficient liquidity for same-asset bridging.
POST /api/swap/approval HTTP/1.1
Host: app.across.to
Content-Type: application/json
Accept: */*
Content-Length: 372
{
"actions": [
{
"target": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"functionSignature": "function transfer(address to, uint256 value)",
"args": [
{
"value": "0x718648C8c531F91b528A7757dD2bE813c3940608",
"populateDynamically": false
},
{
"value": "0",
"populateDynamically": true,
"balanceSourceToken": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
}
],
"value": "0",
"isNativeTransfer": false
}
]
}
{
"crossSwapType": "bridgeableToAny",
"amountType": "exactInput",
"checks": {
"allowance": {
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"spender": "0x6f26Bf09B1C792e3228e5467807a900A503c0281",
"actual": "115792089237316195423570985008687907853269984665640564039457584007913099639935",
"expected": "1000000"
},
"balance": {
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"actual": "7169942",
"expected": "1000000"
}
},
"steps": {
"bridge": {
"inputAmount": "1000000",
"outputAmount": "980662",
"tokenIn": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
},
"tokenOut": {
"decimals": 6,
"symbol": "USDC",
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"chainId": 42161
},
"fees": {
"totalRelay": {
"pct": "19338767572622738",
"total": "19338"
},
"relayerCapital": {
"pct": "100000000000000",
"total": "100"
},
"relayerGas": {
"pct": "19227000000000000",
"total": "19227"
},
"lp": {
"pct": "11767572622738",
"total": "11"
}
}
},
"destinationSwap": {
"tokenIn": {
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"decimals": 6,
"symbol": "USDC",
"chainId": 42161
},
"tokenOut": {
"decimals": 18,
"symbol": "ETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"name": "Ether",
"chainId": 42161
},
"inputAmount": "980662",
"maxInputAmount": "980662",
"outputAmount": "263466241499732",
"minOutputAmount": "260831579075100",
"swapProvider": {
"name": "0x",
"sources": [
"uniswap_v3"
]
}
}
},
"inputToken": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
},
"outputToken": {
"decimals": 18,
"symbol": "ETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"name": "Ether",
"chainId": 42161
},
"refundToken": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
},
"fees": {
"total": {
"amount": "47651",
"amountUsd": "0.047642182071510164",
"pct": "47651283466652296",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"originGas": {
"amount": "134879133226",
"amountUsd": "0.000502067341563801",
"token": {
"chainId": 10,
"address": "0x0000000000000000000000000000000000000000",
"decimals": 18,
"symbol": "ETH"
}
},
"destinationGas": {
"amount": "5161137520505",
"amountUsd": "0.019223327642999999",
"pct": "19227000000000001",
"token": {
"chainId": 42161,
"address": "0x0000000000000000000000000000000000000000",
"decimals": 18,
"symbol": "ETH"
}
},
"relayerCapital": {
"amount": "100",
"amountUsd": "0.0000999809",
"pct": "100000000000000",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"lpFee": {
"amount": "11",
"amountUsd": "0.000010997899",
"pct": "11000000000000",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"relayerTotal": {
"amount": "19338",
"amountUsd": "0.019334306442000002",
"pct": "19338000000000001",
"token": {
"decimals": 6,
"symbol": "USDC",
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"name": "USD Coin",
"chainId": 10
}
},
"app": {
"amount": "0",
"amountUsd": "0.0",
"pct": "0",
"token": {
"decimals": 18,
"symbol": "ETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"name": "Ether",
"chainId": 42161
}
}
},
"inputAmount": "1000000",
"expectedOutputAmount": "263466241499732",
"minOutputAmount": "260831579075100",
"expectedFillTime": 3,
"swapTx": {
"simulationSuccess": true,
"chainId": 10,
"to": "0x6f26Bf09B1C792e3228e5467807a900A503c0281",
"data": "0xad5425c6000000000000000000000000a4d353bbc130cbef1811f27ac70989f9d568ceab...",
"gas": "122554",
"maxFeePerGas": "1100569",
"maxPriorityFeePerGas": "1100000"
},
"id": "6pl4c-1754347045980-2353645c0fb7"
}
Returns a list of all supported blockchains that support crosschain swaps on Across Protocol.
List of supported chains
Bad request
Internal server error
GET /api/swap/chains HTTP/1.1
Host: app.across.to
Accept: */*
[
{
"chainId": 1,
"name": "Ethereum",
"publicRpcUrl": "https://mainnet.gateway.tenderly.co",
"explorerUrl": "https://etherscan.io",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/mainnet/assets/logo.svg"
},
{
"chainId": 10,
"name": "Optimism",
"publicRpcUrl": "https://mainnet.optimism.io",
"explorerUrl": "https://optimistic.etherscan.io",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/optimism/assets/logo.svg"
},
{
"chainId": 137,
"name": "Polygon",
"publicRpcUrl": "https://polygon.drpc.org",
"explorerUrl": "https://polygonscan.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/polygon/assets/logo.svg"
},
{
"chainId": 42161,
"name": "Arbitrum",
"publicRpcUrl": "https://arb1.arbitrum.io/rpc",
"explorerUrl": "https://arbiscan.io",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/arbitrum/assets/logo.svg"
},
{
"chainId": 324,
"name": "zkSync",
"publicRpcUrl": "https://mainnet.era.zksync.io",
"explorerUrl": "https://era.zksync.network",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/zk-sync/assets/logo.svg"
},
{
"chainId": 8453,
"name": "Base",
"publicRpcUrl": "https://mainnet.base.org",
"explorerUrl": "https://basescan.org",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/base/assets/logo.svg"
},
{
"chainId": 59144,
"name": "Linea",
"publicRpcUrl": "https://rpc.linea.build",
"explorerUrl": "https://lineascan.build",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/linea/assets/logo.svg"
},
{
"chainId": 34443,
"name": "Mode",
"publicRpcUrl": "https://mainnet.mode.network",
"explorerUrl": "https://explorer.mode.network",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/mode/assets/logo.svg"
},
{
"chainId": 81457,
"name": "Blast",
"publicRpcUrl": "https://rpc.blast.io",
"explorerUrl": "https://blastscan.io",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/blast/assets/logo.svg"
},
{
"chainId": 1135,
"name": "Lisk",
"publicRpcUrl": "https://rpc.api.lisk.com",
"explorerUrl": "https://blockscout.lisk.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/lisk/assets/logo.svg"
},
{
"chainId": 534352,
"name": "Scroll",
"publicRpcUrl": "https://rpc.scroll.io",
"explorerUrl": "https://scrollscan.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/scroll/assets/logo.svg"
},
{
"chainId": 690,
"name": "Redstone",
"publicRpcUrl": "https://rpc.redstonechain.com",
"explorerUrl": "https://explorer.redstone.xyz",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/redstone/assets/logo.svg"
},
{
"chainId": 7777777,
"name": "Zora",
"publicRpcUrl": "https://rpc.zora.energy",
"explorerUrl": "https://explorer.zora.energy",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/zora/assets/logo.svg"
},
{
"chainId": 480,
"name": "World Chain",
"publicRpcUrl": "https://worldchain-mainnet.g.alchemy.com/public",
"explorerUrl": "https://worldchain-mainnet-explorer.alchemy.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/world-chain/assets/logo.svg"
},
{
"chainId": 41455,
"name": "Aleph Zero",
"publicRpcUrl": "https://rpc.alephzero.raas.gelato.cloud",
"explorerUrl": "https://evm-explorer.alephzero.org",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/aleph-zero/assets/logo.svg"
},
{
"chainId": 57073,
"name": "Ink",
"publicRpcUrl": "https://rpc-gel.inkonchain.com",
"explorerUrl": "https://explorer.inkonchain.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/ink/assets/logo.svg"
},
{
"chainId": 1868,
"name": "Soneium",
"publicRpcUrl": "https://rpc.soneium.org",
"explorerUrl": "https://soneium.blockscout.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/soneium/assets/logo.svg"
},
{
"chainId": 130,
"name": "Unichain",
"publicRpcUrl": "https://mainnet.unichain.org",
"explorerUrl": "https://uniscan.xyz",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/unichain/assets/logo.svg"
},
{
"chainId": 232,
"name": "Lens",
"publicRpcUrl": "https://api.lens.matterhosted.dev",
"explorerUrl": "https://explorer.lens.xyz",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/lens/assets/logo.svg"
},
{
"chainId": 56,
"name": "BNB Smart Chain",
"publicRpcUrl": "https://bsc-dataseed1.binance.org",
"explorerUrl": "https://bscscan.com",
"logoUrl": "https://raw.githubusercontent.com/across-protocol/frontend/master/scripts/chain-configs/bsc/assets/logo.svg"
}
]
Returns a list of all supported tokens that support crosschain swaps on Across Protocol.
List of supported tokens
Bad request
Internal server error
GET /api/swap/tokens HTTP/1.1
Host: app.across.to
Accept: */*
[
{
"chainId": 1,
"address": "0x111111111117dC0aa78b770fA6A738034120C302",
"name": "1inch",
"symbol": "1INCH",
"decimals": 18,
"logoUrl": "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028",
"priceUsd": "0.2530907825982632"
},
{
"chainId": 1,
"address": "0xB98d4C97425d9908E66E53A6fDf673ACcA0BE986",
"name": "Arcblock",
"symbol": "ABT",
"decimals": 18,
"logoUrl": "https://assets.coingecko.com/coins/images/2341/thumb/arcblock.png?1547036543",
"priceUsd": "0.7697036684522818"
},
{
"chainId": 1,
"address": "0xEd04915c23f00A313a544955524EB7DBD823143d",
"name": "Alchemy Pay",
"symbol": "ACH",
"decimals": 8,
"logoUrl": "https://assets.coingecko.com/coins/images/12390/thumb/ACH_%281%29.png?1599691266",
"priceUsd": "0.02048510218654289"
}
]
Returns a list of all supported sources that support crosschain swaps on Across Protocol.
Chain ID of the chain to get supported sources for.
1
1
List of supported sources for crosschain swaps for a given chain
Bad request
Internal server error
GET /api/swap/sources HTTP/1.1
Host: app.across.to
Accept: */*
[
"0x_rfq",
"1inch",
"angle",
"arbswap",
"balancer",
"balancer_v2",
"balancer_v3",
"camelot",
"camelot_v2",
"camelot_v3",
"..."
]
Tracking Deposits
Returns the fill status of a deposit along with a corresponding fill transaction hash if filled.
This endpoint loads data queried by an indexing service that polls relevant events on a 10-second cadence. Users should therefore expect an average latency of 1 to 15 seconds after submitting a deposit to see the status changed in this endpoint. This delay comes from the time it takes for the internal indexing to include the deposit transaction.
Chain Id where the deposit originated from. This must be used in conjunction with depositId. depositTxHash is not required when using this parameter.
{"value":137}
The deposit id that is emitted from the DepositV3 function call as a V3FundsDeposited event. This must be used in conjunction with originChainId. depositTxHash is not required when using this parameter.
{"value":1349975}
The deposit transaction hash that is emitted from the DepositV3 function call as a V3FundsDeposited event. If you are using this, you donot need the above parameters.
{"value":"0x56a86610aad2a653161c9dd4b4972f948198fd02ae9589cfac1d57bd86a156c1"}
Lifecycle of a transaction
GET /api/deposit/status HTTP/1.1
Host: app.across.to
Accept: */*
Lifecycle of a transaction
{
"status": "filled",
"originChainId": 8453,
"depositId": "4406025",
"depositTxHash": "0x0e44727151684ef4cfe7744aad88007cf55b155a64f5f9047fb9d2fa53780967",
"depositTxnRef": "0x0e44727151684ef4cfe7744aad88007cf55b155a64f5f9047fb9d2fa53780967",
"fillTx": "0x0e7b85f1c49c4c89f3b381f12a24d6838be16a41021ab16645bae9dcd1278238",
"fillTxnRef": "0x0e7b85f1c49c4c89f3b381f12a24d6838be16a41021ab16645bae9dcd1278238",
"destinationChainId": 137,
"depositRefundTxHash": null,
"depositRefundTxnRef": null,
"actionsSucceeded": "null,",
"pagination": {
"currentIndex": 0,
"maxIndex": 0
}
}
Returns all deposits for a given depositor.
This endpoint loads data queried by an indexing service that polls relevant events on a 10-second cadence. Users should therefore expect an average latency of 1 to 15 seconds after submitting a deposit to see the status changed in this endpoint. This delay comes from the time it takes for the internal indexing to include the deposit transaction.
Maximum number of deposits to return in a single request; used for pagination.
{"value":50}
Number of deposits to skip from the beginning of the result set; used for pagination.
{"value":100}
Wallet address of the depositor; filters results to deposits made by this address.
{"value":"0x89f423567c2648BB828c3997f60c47b54f57Fa6e"}
List of deposits for a given depositor
GET /api/deposits HTTP/1.1
Host: app.across.to
Accept: */*
List of deposits for a given depositor
[
{
"id": 14503095,
"relayHash": "0x89cb192c96170615b7e1a0fb20fb64b7c04f6641b301e2735287533e1dbb22ac",
"depositId": "4333561",
"originChainId": 8453,
"destinationChainId": 42161,
"depositor": "0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB",
"recipient": "0xA4d353BBc130cbeF1811f27ac70989F9d568CeAB",
"inputToken": "0x4200000000000000000000000000000000000006",
"inputAmount": "1000000000000000",
"outputToken": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"outputAmount": "995226997892889",
"message": "0x",
"messageHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"exclusiveRelayer": "0xCad97616f91872C02BA3553dB315Db4015cBE850",
"exclusivityDeadline": "2025-07-24T16:11:48.000Z",
"fillDeadline": "2025-07-24T19:26:20.000Z",
"quoteTimestamp": "2025-07-24T16:07:11.000Z",
"depositTxHash": "0x92ffc5d69d00e14e79254f68adab030dd38119996501a88cac0da76557703d11",
"depositBlockNumber": 33292078,
"depositBlockTimestamp": "2025-07-24T16:11:43.000Z",
"status": "filled",
"depositRefundTxHash": null,
"swapTokenPriceUsd": null,
"swapFeeUsd": null,
"bridgeFeeUsd": "0.017884155707075979",
"inputPriceUsd": "3746.9406687316323",
"outputPriceUsd": "3746.9406687316323",
"fillGasFee": "2532354948000",
"fillGasFeeUsd": "0.009488583742324977",
"fillGasTokenPriceUsd": "3746.9406687316323",
"swapTransactionHash": null,
"swapToken": null,
"swapTokenAmount": null,
"relayer": "0xCad97616f91872C02BA3553dB315Db4015cBE850",
"fillBlockTimestamp": "2025-07-24T16:11:43.000Z",
"fillTx": "0x7b98cebd7ee6e2f75fead81d73005cdf25149141c2045cb5f731b6d9c6b9c517",
"depositTxnRef": "0x92ffc5d69d00e14e79254f68adab030dd38119996501a88cac0da76557703d11",
"depositRefundTxnRef": null,
"fillTxnRef": "0x7b98cebd7ee6e2f75fead81d73005cdf25149141c2045cb5f731b6d9c6b9c517",
"speedups": []
}
]
Bridge with Suggested Fees API
Returns suggested fees based inputToken
+outputToken
, originChainId
, destinationChainId
, and amount
. Also includes data used to compute the fees.
Address of token to bridge on the origin chain. Must be used together with parameter outputToken
. For ETH, use the wrapped address, like WETH.
Note that the address provided must exist on the specified originChainId
below.
{"value":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"}
Address of token to bridge on the destination chain. Must be used together with parameter inputToken
. For ETH, use the wrapped address, like WETH.
Note that the address provided must exist on the specified destinationChainId
below.
{"value":"0x4200000000000000000000000000000000000006"}
Chain ID where the specified token
or inputToken
exists.
{"value":1}
The desired destination chain ID of the bridge transfer.
{"value":10}
Amount of the token to transfer.
Note that this amount is in the native decimals of the token. So, for WETH, this would be the amount of human-readable WETH multiplied by 1e18. For USDC, you would multiply the number of human-readable USDC by 1e6.
{"value":"1000000000000000000"}
Recipient of the deposit. Can be an EOA or a contract. If this is an EOA and message is defined, then the API will throw a 4xx error.
Example: 0xc186fA914353c44b2E33eBE05f21846F1048bEda
Calldata passed to the recipient
if recipient
is a contract address. This calldata is passed to the recipient via the recipient's handleAcrossMessage() public function.
Example: 0xABC123
Optionally override the relayer address used to simulate the fillRelay() call that estimates the gas costs needed to fill a deposit. This simulation result impacts the returned suggested-fees. The reason to customize the EOA would be primarily if the recipientAddress is a contract and requires a certain relayer to submit the fill, or if one specific relayer has the necessary token balance to make the fill.
Example: 0x428AB2BA90Eba0a4Be7aF34C9Ac451ab061AC010
The quote timestamp used to compute the LP fees. When bridging with across, the user only specifies the quote timestamp in their transaction. The relayer then determines the utilization at that timestamp to determine the user's fee. This timestamp must be close (within 10 minutes or so) to the current time on the chain where the user is depositing funds and it should be <= the current block timestamp on mainnet. This allows the user to know exactly what LP fee they will pay before sending the transaction.
If this value isn't provided in the request, the API will assume the latest block timestamp on mainnet.
Example: 1653547649
Suggested fees for the transaction and supporting data
Bad request due to invalid input parameter.
Unexpected error within the API
curl -L \
'https://app.across.to/api/suggested-fees?inputToken=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&outputToken=0x4200000000000000000000000000000000000006&originChainId=1&destinationChainId=10&amount=1000000000000000000'
{
"estimatedFillTimeSec": 2,
"capitalFeePct": "78750000000001",
"capitalFeeTotal": "78750000000001",
"relayGasFeePct": "155024308002",
"relayGasFeeTotal": "155024308002",
"relayFeePct": "78905024308003",
"relayFeeTotal": "78905024308003",
"lpFeePct": "0",
"timestamp": "1754342087",
"isAmountTooLow": false,
"quoteBlock": "23070320",
"exclusiveRelayer": "0x394311A6Aaa0D8E3411D8b62DE4578D41322d1bD",
"exclusivityDeadline": 1754342267,
"spokePoolAddress": "0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5",
"destinationSpokePoolAddress": "0x6f26Bf09B1C792e3228e5467807a900A503c0281",
"totalRelayFee": {
"pct": "78905024308003",
"total": "78905024308003"
},
"relayerCapitalFee": {
"pct": "78750000000001",
"total": "78750000000001"
},
"relayerGasFee": {
"pct": "155024308002",
"total": "155024308002"
},
"lpFee": {
"pct": "0",
"total": "0"
},
"limits": {
"minDeposit": "134862494200912",
"maxDeposit": "1661211802629989209324",
"maxDepositInstant": "231397155893653275446",
"maxDepositShortDelay": "1661211802629989209324",
"recommendedDepositInstant": "231397155893653275446"
},
"fillDeadline": "1754353917",
"outputAmount": "999921094975691997",
"inputToken": {
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"symbol": "ETH",
"decimals": 18,
"chainId": 1
},
"outputToken": {
"address": "0x4200000000000000000000000000000000000006",
"symbol": "ETH",
"decimals": 18,
"chainId": 10
},
"id": "xn8fx-1754342218143-67be35cfbdb6"
}
Returns transfer limits for inputToken
+outputToken
, originChainId
, and destinationChainId
.
Address of token to bridge on the origin chain. Must be used together with parameter outputToken
. For ETH, use the wrapped address, like WETH.
Note that the address provided must exist on the specified originChainId
.
{"value":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"}
Address of token to bridge on the destination chain. Must be used together with parameter inputToken
. For ETH, use the wrapped address, like WETH.
Note that the address provided must match the token address on the specified destinationChainId
below.
{"value":"0x4200000000000000000000000000000000000006"}
Chain ID where the specified token
or inputToken
exists.
{"value":1}
The intended destination chain ID of the bridge transfer.
{"value":10}
Transfer limits
Invalid input
Unexpected error within the API
curl -L \
'https://app.across.to/api/limits?inputToken=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&outputToken=0x4200000000000000000000000000000000000006&originChainId=1&destinationChainId=10'
{
"minDeposit": "134349011863017",
"maxDeposit": "1659439975009194758428",
"maxDepositInstant": "231397155893653275446",
"maxDepositShortDelay": "1659439975009194758428",
"recommendedDepositInstant": "231397155893653275446",
"relayerFeeDetails": {
"relayFeeTotal": "141442042216",
"relayFeePercent": "1414420422160000000000000000",
"gasFeeTotal": "141442042216",
"gasFeePercent": "1414420422160000000000000000",
"capitalFeeTotal": "0",
"capitalFeePercent": "0"
},
"gasFeeDetails": {
"nativeGasCost": "137265",
"opStackL1GasCost": "3993981356",
"gasPrice": "1000740",
"tokenGasCost": "141360557456"
}
}
Returns available routes based on specified parameters.
Chain ID of the originating chain.
1
1
Chain ID of the destination chain.
10
10
Origin chain address of token contract to transfer.
Example: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Destination chain address of token contract to receive.
Example: 0x4200000000000000000000000000000000000006
0x4200000000000000000000000000000000000006
List of available routes
Invalid input
Unexpected error within the API
GET /api/available-routes HTTP/1.1
Host: app.across.to
Accept: */*
[
{
"originChainId": 1,
"originToken": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"destinationChainId": 10,
"destinationToken": "0x4200000000000000000000000000000000000006",
"originTokenSymbol": "WETH",
"destinationTokenSymbol": "WETH",
"isNative": false
},
{
"originChainId": 1,
"originToken": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"destinationChainId": 10,
"destinationToken": "0x4200000000000000000000000000000000000006",
"originTokenSymbol": "ETH",
"destinationTokenSymbol": "ETH",
"isNative": true
}
]
Last updated