Fees
What a transfer costs, where the quote shows it, and how to check it.
Every quote prices the transfer before the user signs. The fee is taken from the transfer itself, not charged separately.
What makes up the fee
| Component | What it is |
|---|---|
| Transfer fee | What Across charges to move the funds |
| App fee | Your own fee, if you set appFeeBps. 0 otherwise |
The total fee is the transfer fee plus the app fee.
What the transfer fee covers
- Gas on both chains. On signature-funded transfers origin gas is included, so the user's wallet pays no gas, apart from a one-time Permit2 approval if one is needed. On approval-funded transfers the wallet pays gas for the transactions it sends.
- Bridge and swap costs, on routes that use them.
- The relayer's margin, set by relayers competing for the order.
Gas is roughly fixed per transfer, so the fee is a larger share of a small transfer than of a large one. On sponsored routes a subsidy covers part or all of the transfer fee, so it can be zero or negative.
Where to find it in the API response
The quote itemises the fee in its fee
object:
| Field | What it is |
|---|---|
transferFee | The transfer fee |
appFee | Your app fee |
totalFee | transferFee + appFee. Sets the expected delivery |
maxTransferFee | The most the transfer fee can be |
maxTotalFee | maxTransferFee + appFee. Sets the guaranteed minimum |
Each entry is in the destination token, with amount in base units and
amountUsd in USD.
Gas the user's wallet pays itself is not part of the fee. It is listed in
gasEstimates with effect: "paid_by_wallet". Entries marked
included_in_transfer_fee are already in transferFee.
On exact_output and min_output quotes the fee lands on the input instead:
origin.amount is the expected spend, and origin.maxAmount is the most the
user can pay.
After the transfer, GET /v1/transfers/{orderId}
reports the app fee in transfer.appFee.
App fees
An app fee is your own fee on top of the transfer, paid by the user.
- Activation. Contact Across to activate app fees for your integration. The App fees tab of the integrator portal then shows your maximum and the share of each fee Across keeps.
- Setting it. Set
appFeeBpson each quote request, anywhere from0up to your maximum. It is in basis points of the input value:10on a 1,000 USDC transfer takes 1 USDC. - Errors. Without activation, or above your maximum, the quote returns
400 request.invalid_fieldwithparam: "appFeeBps". App fees are not available on same-chain swaps. - Payout. Across collects the fee and pays out your share monthly.
transfer.appFee.integratorEarningUsdshows your earning on each transfer. A refunded or failed transfer pays no app fee.
Things to know
The auction sets the final price. transferFee is estimated before
relayers bid, so the delivered amount can land above destination.amount,
and never below destination.minAmount.
- Quotes expire. Fees move with gas prices, so read them from a live
quote and request a new one once
expiresAthas passed. - Missing is not zero.
amountoramountUsdis absent when it cannot be stated, and is never reported as0in its place. An emptygasEstimatesdoes not mean free. - The app fee is a maximum on output modes. On
exact_outputandmin_outputquotes the input is not known yet, soappFeeis sized on the most the user can pay. - Quotes have a fee limit. A quote whose fee would exceed it returns
400 policy.amount_out_of_range. The default allows up to 50% of the input; setmaxFeeon the request to lower it.