appFees.feeBps is an integer from 0 to 10000, where 10000 is 100%. A rate of 25 requests a 0.25% fee. Read the quoted amount rather than calculating it from the rate: collection depends on the route.
- Embedded wallet
- Custom signer
Configure the fee
Start with the embedded-wallet example in Send a transaction. It definesoneAuth, accountAddress, the chains, tokens, amount, and transfer calls used here.Add appFees to that request and enable the experimental clear-signing review. Keep the source constraints and other options from the transaction guide when your flow needs them:clientConfig is the provider, client ID, and sponsorship configuration from the shared setup.Update your existing client rather than creating a second one. Its default applies to SDK intents, batch items, the EIP-1193 provider, wagmi, and the pay button when they use that client.Override the default with appFees on an individual sendIntent request, sendBatchIntent item, or headless prepareIntent request. Use { feeBps: 0 } to disable the fee for that intent; omitting appFees inherits the default. With neither a default nor an override, no fee is requested. Non-integer or out-of-range rates are rejected before signing.Keep application authentication configured even for user-paid intents. The app JWT identifies your Rhinestone project, which receives the fee; the rate is not configured in the developer portal.Display the fee
With clear signing enabled, the review dialog shows App fee as a separate charged line and includes it in the total. It is never labeled sponsored. Blind signing does not show this review, so do not rely on it to disclose the charge.For a custom signing UI,OneAuthHeadlessClient accepts the same client default and per-request override. After your existing headless prepareIntent call, read the quoted USD string:prepared is the result of OneAuthHeadlessClient.prepareIntent(); showFeeToUser represents your UI. An absent app field means that route has no app fee. Refresh the displayed amount whenever you prepare a new quote, before collecting signatures.Validate the rate
The browser chooses the rate. For sponsored intents, add an assertion to the signer from Sponsorship setup:extensionToken() refuses to issue a grant if the requested rate differs from 25 or is missing. Use sponsorshipMode: "required" when sponsorship denial must stop the flow. preferred can obtain a new self-funded quote, and disabled does not request a sponsorship grant.This check authorizes the requested rate, not the amount ultimately collected. It does not enforce a fee on self-funded transactions or guarantee that a route can carry one. See Policies and security for the authorization boundary.