/fee/estimateEstimate the feePreview what an operation would cost for the given calls and transferred assets, without submitting anything. The shape is the same on every rail, which is what lets a wallet's Max button stay rail-agnostic.
- TWO FIGURES FOR THE SAME FEE. estimatedFee and estimatedFeeRaw are the worst case: the gas limits priced at the bumped ceiling. They are the only pair to reserve, cap, or check a balance against. expectedFee and expectedFeeRaw are what the operation is expected to actually bill, and are the pair to show a user.
- gasFee and serviceFee split the expected figure into the network's own cost and the UGTP markup, and sum back to it exactly. Display only, and they arrive together or not at all.
- requiredBalanceRaw, on the executor rail only, is what the account must HOLD of the fee token for the request to pass validation — which is not always the fee alone. Never read its absence as zero.
- On the self-funded rail nothing of ours is priced, so the whole amount is the account's own gas.
- Omit feeToken for a native-coin estimate. The executor rail always charges in an ERC-20 and refuses a preview without one (FEE_TOKEN_REQUIRED); it prices ERC-20 transfers only (EXECUTOR_RAIL_PREVIEW_UNSUPPORTED, EXECUTOR_RAIL_NATIVE_UNSUPPORTED).
- 429 when the rate limit is exceeded; check the Retry-After response header.
Authentication: X-API-Key
Input — request body
networkIdstring required- Chain id
senderAddressstring required- The account address whose operation is priced
callsCall[] required- Each: { to, data?, value? } (hex)
transferredAssetsAsset[] required- Each: { address, amount } (base-unit hex)
feeTokenstring- Fee token address (omit for native-gas estimate)
Input — example request
{
"networkId": "137",
"senderAddress": "0xCa9d43184Cc3179609f77D38433D363833C73c60",
"calls": [
{
"to": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
"value": "0x0",
"data": "0x..."
}
],
"transferredAssets": [
{
"address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
"amount": "0xf4240"
}
],
"feeToken": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
}Output — example response (200)
{
"estimatedFee": "0.0512",
"estimatedFeeRaw": "0xc7f8",
"expectedFee": "0.0410",
"expectedFeeRaw": "0xa028",
"gasFee": "0.0400",
"gasFeeRaw": "0x9c40",
"serviceFee": "0.0010",
"serviceFeeRaw": "0x3e8",
"symbol": "USDT"
}Output — every status this endpoint answers with
| Status | When |
|---|---|
200 | Fee estimate |
400 | Invalid request body or query parameters |
401 | Missing or invalid credentials |
429 | Rate limit exceeded — retry after the number of seconds in the `Retry-After` response header |
500 | Internal server error |