Skip to main content
Trading fees are charged per fill: fee = notional × rate. The rate depends on your fee tier and whether the fill added or removed liquidity. Fees settle in USDC against the portfolio that owns the fill. Funding is a separate flow and is not a trading fee — see Positions, leverage, and funding.

Maker vs taker

Every fill has a liquidity role, and the role sets the rate.
  • A maker fill rests on the book and is matched by someone else’s incoming order. It adds liquidity, so it pays the lower maker rate.
  • A taker fill crosses the spread and matches against resting orders. It removes liquidity, so it pays the higher taker rate.
A market order always takes liquidity. A limit order makes liquidity only if it rests before matching; if it crosses on arrival, that portion is a taker fill. A single order can produce both maker and taker fills, each tagged with its own role.

The fee formula

The exchange computes notional and fee in integer units, then charges the fee in USDC.
notional = floor( price × |quantity| / 1e12 )   # CentiCents (1e-4 USDC)
fee      = notional × rate                       # rate is the decimal fraction
price is a PriceOfAtom (10⁻¹⁶ USDC per atom) and quantity is in atoms; the 1e12 divisor bridges those to CentiCents. For the unit definitions and conversions, see Markets, assets, and precision. rate is the decimal fraction from your tier — for example 0.00045 taker means 4.5 bps. A fill of 25,000 USDC notional at that rate costs 25,000 × 0.00045 = 11.25 USDC. The same fill as a maker at 0.00020 costs 25,000 × 0.00020 = 5.00 USDC.

Your current tier and rates

GET /api/v1/account returns your live tier and the rates applied to your fills.
FieldTypeMeaning
fee_tierint (0–5)Your current tier index; 0 is the base tier.
taker_ratestringTaker rate as a decimal fraction (e.g. "0.00045").
maker_ratestringMaker rate as a decimal fraction (e.g. "0.00020").
volume_14dstringYour 14-day trailing trading volume in USDC.
Use these rates, not the public schedule, to predict what a fill will cost — they are the rates the exchange actually applies to you.

The public fee schedule

GET /api/v1/fees/schedule returns every tier. It takes no authentication; fee schedules are public. The response is an array of FeeTierResponse:
tier
integer
The tier index. 0 is the base tier.
min_volume
string
Minimum 14-day trailing trading volume in USDC to qualify for this tier, as a decimal string.
taker_rate
string
Taker rate as a decimal fraction (e.g. "0.00045" = 4.5 bps).
maker_rate
string
Maker rate as a decimal fraction (e.g. "0.00020" = 2.0 bps).
[
  { "tier": 0, "min_volume": "0.00", "taker_rate": "0.00045", "maker_rate": "0.00020" }
]

How tiering works

Tiers are set by your 14-day trailing USDC trading volume. Read your volume from AccountResponse.volume_14d and compare it against each tier’s min_volume to see how far you are from the next tier. As your trailing volume rises past a tier’s min_volume, your fee_tier moves up and your rates drop; as it falls back, the tier falls back with it. Volume is account-wide, not per portfolio.

Reading the fee on each fill

Every fill records the exact fee charged and which role it filled as. Read fills with GET /api/v1/fills. Each FillResponse carries:
FieldTypeMeaning
feestringThe fee paid for this fill, in USDC.
liquidityTAKER or MAKERThe liquidity role that set the rate.
The fee field is the source of truth for what you were charged — your computed notional × rate is an estimate that can differ by sub-cent rounding. For walking an order through to its fills, see Manage positions.