Across Docs

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

ComponentWhat it is
Transfer feeWhat Across charges to move the funds
App feeYour 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:

FieldWhat it is
transferFeeThe transfer fee
appFeeYour app fee
totalFeetransferFee + appFee. Sets the expected delivery
maxTransferFeeThe most the transfer fee can be
maxTotalFeemaxTransferFee + 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 appFeeBps on each quote request, anywhere from 0 up to your maximum. It is in basis points of the input value: 10 on a 1,000 USDC transfer takes 1 USDC.
  • Errors. Without activation, or above your maximum, the quote returns 400 request.invalid_field with param: "appFeeBps". App fees are not available on same-chain swaps.
  • Payout. Across collects the fee and pays out your share monthly. transfer.appFee.integratorEarningUsd shows 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 expiresAt has passed.
  • Missing is not zero. amount or amountUsd is absent when it cannot be stated, and is never reported as 0 in its place. An empty gasEstimates does not mean free.
  • The app fee is a maximum on output modes. On exact_output and min_output quotes the input is not known yet, so appFee is 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; set maxFee on the request to lower it.

On this page