Skip to content

Get Fee Rate

Retrieve the authenticated wallet's current fee tier, 14-day trading volume, wallet-effective maker/taker rates, and the complete public fee schedule.

Endpoint

POST https://papi.synthetix.io/v1/trade

Request

Request Format

{
  "params": {
    "action": "getFeeRate",
    "subAccountId": "1867542890123456789"
  },
  "signature": {
    "v": 28,
    "r": "0x19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef",
    "s": "0xabcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600"
  }
}

Request Parameters

ParameterTypeRequiredDescription
paramsobjectYesRequest parameters wrapper
params.actionstringYesMust be "getFeeRate"
params.subAccountIdstringYesSubAccount ID to query
ParameterTypeRequiredDescription
nonceuint64Yes*Positive integer nonce (must be incrementing and unique per request)
signatureobjectYesEIP-712 signature object
expiresAfteruint64NoUnix milliseconds expiration timestamp (5x rate limit on stale cancels)

:::info Common Parameters These are top-level request parameters. The subAccountId parameter is specified within the params object (see each endpoint's parameter table). :::

:::info SubAccountAction Endpoints Endpoints using SubAccountAction signing (getPositions, getOpenOrders, getOrderHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates, getWithdrawableAmounts, getFeeRate, getSnaxpotEpochTickets) do not require the nonce parameter. Only signature and optional expiresAfter are needed. :::

Response

Success Response

{
  "status": "ok",
  "response": {
    "volume14d": "5500000.00",
    "currentTier": {
      "tierId": "tier_2",
      "tierLevel": 2,
      "tierName": "Tier 2",
      "tierType": "volume",
      "minTradeVolume": "5000000",
      "makerFeeRate": "0.00016",
      "takerFeeRate": "0.0004"
    },
    "makerFeeRate": "0.000144",
    "takerFeeRate": "0.00036",
    "referralDiscountApplied": true,
    "referralDiscount": "0.9",
    "tiers": [
      {
        "tierId": "tier_0",
        "tierLevel": 0,
        "tierName": "Regular User",
        "minTradeVolume": "0",
        "makerFeeRate": "0.0002",
        "takerFeeRate": "0.0005"
      },
      {
        "tierId": "tier_2",
        "tierLevel": 2,
        "tierName": "Tier 2",
        "minTradeVolume": "5000000",
        "makerFeeRate": "0.00016",
        "takerFeeRate": "0.0004"
      }
    ]
  },
  "request_id": "5ccf215d37e3ae6d",
  "timestamp": 1735689900000
}

Response Fields

FieldTypeDescription
volume14dstringWallet's 14-day rolling trading volume in USDT
currentTierobjectWallet's active tier with raw schedule rates
currentTier.tierIdstringStable tier identifier
currentTier.tierLevelinteger | nullTier position in the schedule; null for custom tiers
currentTier.tierNamestringHuman-readable tier name
currentTier.tierTypestringTier category (for example "volume" or "custom")
currentTier.minTradeVolumestringMinimum rolling volume required for the tier
currentTier.makerFeeRatestringRaw schedule maker fee rate for this tier
currentTier.takerFeeRatestringRaw schedule taker fee rate for this tier
makerFeeRatestringWallet-effective maker fee rate currently charged (after any referral discount)
takerFeeRatestringWallet-effective taker fee rate currently charged (after any referral discount)
referralDiscountAppliedbooleantrue when the subaccount has an active referral discount reflected in makerFeeRate/takerFeeRate
referralDiscountstringDiscount multiplier applied (for example "0.9" = 10% discount); "0" when no discount is active
tiersarrayComplete fee schedule with raw schedule rates

Tier Object (tiers[])

FieldTypeDescription
tierIdstringStable tier identifier
tierLevelintegerTier position in the schedule
tierNamestringHuman-readable tier name
minTradeVolumestringMinimum rolling volume required for the tier
makerFeeRatestringMaker fee rate for this tier
takerFeeRatestringTaker fee rate for this tier

Implementation Notes

  • Uses SubAccountAction EIP-712 signing with action: "getFeeRate"
  • subAccountId belongs in params; sign expiresAfter inside the EIP-712 SubAccountAction message (commonly "0" for no expiry). A top-level expiresAfter that does not match the signed message will fail authentication
  • currentTier and tiers always show raw schedule rates without wallet-specific adjustments
  • tierType is present on currentTier only; items in tiers[] do not include tierType
  • makerFeeRate and takerFeeRate at the response root reflect the rates the wallet is actually charged, including any active referral discount
  • currentTier.tierLevel is null for custom tiers and an integer for volume tiers
  • Fee rates are decimal strings (for example "0.0005" = 0.05%)
  • When referralDiscountApplied is true, referralDiscount is the multiplier applied to the tier rates (for example "0.9" means rates are reduced by 10%)
  • When no referral discount is active, referralDiscountApplied is false and referralDiscount is "0"
  • Also available via WebSocket POST on /v1/ws/trade; see Get Fee Rate (WebSocket)
  • For public tier configuration without authentication, use Get Tiers

Signing

All trading methods are signed using EIP-712. Each successful trading request will contain:

  • A piece of structured data that includes the sender address
  • A signature of the hash of that structured data, signed by the sender

For detailed information on EIP-712 signing, see EIP-712 Signing.

Nonce Management

The nonce system prevents replay attacks and ensures order uniqueness:

  • Use any positive integer as nonce
  • Each nonce must be greater than the previous one (incrementing)
  • Date.now() is a convenient option, not a requirement
  • If nonce conflicts occur, increment by 1 and retry

:::note SubAccountAction Exception SubAccountAction endpoints (getPositions, getOpenOrders, getOrderHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates, getWithdrawableAmounts, getFeeRate, getSnaxpotEpochTickets) do not require a nonce. Only the signature and optional expiresAfter parameters are needed. :::

Error CodeDescriptionRetryable
UNAUTHORIZEDEIP-712 signature validation failedNo
VALIDATION_ERRORRequest validation failedNo
MISSING_REQUIRED_FIELDRequired field is missingNo
INVALID_FORMATField format is invalidNo
INVALID_VALUEInvalid parameter valueNo
RATE_LIMIT_EXCEEDEDToo many requests in time windowYes
INSUFFICIENT_MARGINNot enough margin for tradeNo
ORDER_NOT_FOUNDOrder does not existNo
OPERATION_TIMEOUTOperation timed outYes

Related Endpoints