Fee Glossary

Relay quotes include the following fees: gas, relayerService, and relayerGas. The two relayer fees (service and gas) are combined to make the full relayer fee.

gas: The gas fee to be paid on the origin chain to execute the transaction. This is usually paid by the user to deposit funds to the relayer to initiate the bridge or swap.

relayer: The sum of the relayerService and the relayerGas.

relayerService: The service fee paid to the relayer to facilitate execution.

relayerGas: The gas fee given to the solver to pay gas fees on the destination chain.

appFees: Third party fees added on top of the existing fees, this fee is added by app developers and accrues offchain to minimize gas costs.

Gas fees are estimates and may fluctuate over time, if using in a calculation we recommend adding a small buffer to account for these fluctuations.

What are app fees?

App fees are additional fees set by third-party developers on top of existing fees. These fees are specified when generating a quote and accrue off-chain, meaning they are not immediately paid out. Instead, the app fee payee must manually claim them later.

App fees are measured in basis points (bps) based on the input value of an order. When setting an app fee, a claim address must be provided, which will be used for withdrawing accumulated fees. A single quote can include multiple app fees.

You can accrue fees by including appFees in the Quote API.

Since app fees accrue off-chain, we maintain a database that tracks:

  • The app fee payee address
  • The currency in which fees are accrued
  • The total claimable balance per currency

How do app fees work?

App fees behave differently depending on whether the request is cross-chain or same-chain.

Cross-Chain

  • The app fee accrues in the currency sent to the solver.
  • The app fee is recorded after the fill transaction is completed.

Same-Chain

  • App fees apply only to swaps—not to wraps, unwraps, or sends.
  • Fees are added in the form of the native currency. Even if the user isn’t initially spending native currency, they may still need to pay a small amount of it. For example, swapping $MOG -> $MEME may still require paying some ETH as an app fee.
  • Important: The app fee must be paid, or the transaction will fail.
  • If the input currency is native currency, instead of adding extra funds, the fee is deducted from the original amount being sent.
  • The fee is recorded only after the same-chain transaction is indexed.

Claiming App Fees Across Chains

App fee payees can claim accrued fees on any chain where the payment currency exists. If a payee accumulates USDC across multiple chains, these balances will be consolidated automatically when they proceed with a claim.

The claim process starts by requesting a quote with originChainId=0. To claim the balance, the payee must prove ownership of their claim address by signing a message and submitting it.

How to know your offchain balance?

To check your accrued off-chain fees, use the Config API with originChainId=0. Here’s an example curl command:

curl --location 'https://api.relay.link/config/v2?originChainId=0&currency=eth&user=0x03508bB71268BBA25ECaCC8F620e01866650532c&destinationChainId=1' 

The response includes the user.balance field, reflecting your off-chain balance:

{
  "enabled": true,
  "user": {
    "balance": "111912125413088295",
    "maxBridgeAmount": "110982574378439751"
  },
  "solver": {
    "address": "0xf70da97812cb96acdf810712aa562db8dfa3dbef",
    "balance": "164745206761785203599",
    "capacityPerRequest": "131796165409428162879"
  },
  "supportsExternalLiquidity": false
}

How to claim your off-chain balance?

To claim your app fees, initiate a bridge transaction from chainId=0 to any other chain. If using the API, the response will guide you through signing and submitting a message to the /execute/permit endpoint to verify ownership of your claim address. The SDK automates this process for you.

curl --request POST \
  --url https://api.relay.link/execute/bridge \
  --header 'Content-Type: application/json' \
  --data '{
  "user": "0x03508bB71268BBA25ECaCC8F620e01866650532c",
  "originChainId": 0,
  "destinationChainId": 1,
  "currency": "eth",
  "amount": "1000"
}'

An example response from the API would be:

{
    "steps": [
        {
            "id": "authorize",
            "action": "Sign authorization",
            "description": "Authorize the solver to spend funds from your wallet",
            "kind": "signature",
            "items": [
                {
                    "status": "incomplete",
                    "data": {
                        "sign": {
                            "signatureKind": "eip191",
                            "message": "0x7f47382bd00e61fce60cdbc786e40128605f39a80dd3af6ff3df53aa8a39ffdf"
                        },
                        "post": {
                            "endpoint": "/execute/permits",
                            "method": "POST",
                            "body": {
                                "kind": "request",
                                "requestId": "0x7f47382bd00e61fce60cdbc786e40128605f39a80dd3af6ff3df53aa8a39ffdf"
                            }
                        }
                    },
                    "check": {
                        "endpoint": "/intents/status?requestId=0x7f47382bd00e61fce60cdbc786e40128605f39a80dd3af6ff3df53aa8a39ffdf",
                        "method": "GET"
                    }
                }
            ]
        }
    ],
    "fees": {
        "gas": "0",
        "relayer": "25464163435202",
        "relayerGas": "25464163435200",
        "relayerService": "2",
        "relayerCurrency": "eth",
        "app": "0",
        "appCurrency": "eth"
    },
    "breakdown": [
        {
            "value": "1000",
            "timeEstimate": 10
        }
    ],
    "balances": {
        "userBalance": "75021651210714015",
        "requiredToSolve": "25464163436202"
    }
}

You can then send a request to /execute/permit with the requestId and signature to claim your fees. An example request would be:

curl --request POST \
  --url `https://api.relay.link/execute/permits?signature=${signature}` \
  --header "Content-Type: application/json" \
  --data '{
    "kind": "request",
    "requestId": "0x7f47382bd00e61fce60cdbc786e40128605f39a80dd3af6ff3df53aa8a39ffdf"
  }'

Once done, you can check your balance again to verify the claim.