How to check exactly what you paid in fees on Bybit, OKX and Bitget
None of the three exchanges gives you a monthly fee statement. The fee is a column inside an order or trade export, and on spot it is often not even in USDT. This guide gives you the exact menu path and export button on each exchange, the column to read, and a two-cell formula that turns a month of fills into one number: your effective fee rate. Run it once a month and you will know what trading actually cost you, as a percentage of what you traded.
REBATLYUse it on a new account at signup — exchanges cannot attach a code afterwards.Guides
$10M+ rebates paid · Paid daily in USDT · No password or API keys, ever
Already signed up? Message @rebatly and we'll confirm you're linked.
The short answer: a 10-minute monthly audit
Every exchange shows the fee on every fill, but none of them adds it up for you. So the audit is a routine you run once a month, a day or two into the new month, and it takes about ten minutes once you know where the buttons are.
1) Export last month's order or trade history from each exchange you use (exact paths in the next three sections). 2) Open the CSV and find the fee column and the fee-unit column. 3) Convert any fee that is not in USDT at the fill price on that row. 4) Sum the USDT fees and sum the filled value. 5) Divide one by the other. That is your effective fee rate, the number you benchmark against the exchange's fee page for your own account.
Two rules keep the number honest. Exclude funding payments, which are not trading fees and are covered separately in funding rate vs trading fees. And benchmark against your account's own fee-rate page rather than a published table: Bybit says outright that rates vary by region and points you to its My Fee Rate page, and OKX's Singapore fee page shows a different regular-user spot schedule (0.10% maker / 0.20% taker) from its global page (0.08% / 0.10%).
| Step | What you do | Time |
|---|---|---|
| 1 | Export last month's trade or order history per exchange | 3–5 min |
| 2 | Locate the fee and fee-unit columns | 1 min |
| 3 | Convert non-USDT fees at that row's fill price | 2 min |
| 4 | Sum USDT fees; sum filled value | 1 min |
| 5 | Divide, then compare with your account's fee-rate page | 1 min |
Where the fee history lives on Bybit
Bybit has a fast path and a bulk path.
Fast path (per product). From the Bybit homepage go to Orders → Unified Trading Order, open the product history tab you want and click Export. Each export covers up to six months of records within the last two years, is capped at 10,000 entries, and you may submit up to ten export requests per day for Spot orders and five for Derivatives orders. For most monthly audits this is the route to use.
Bulk path (Data Export). Hover over your profile and go to Account → Data Export (or Assets → Funding Account → History → Data Export). Three data types are offered: Account Statement (PDF), Transaction Log (CSV) and Order History (CSV). Order History is the one that explicitly includes fees, alongside contract type, direction, quantity, entry and filled prices and P&L. Each export is limited to one year, you get a maximum of 50 exports per month across all data types, generation takes about 1–3 days, and the download link is valid for seven days. Data Export requires Identity Verification, is not available on the app, and arrives as a compressed archive containing comma-delimited CSVs (Bybit publishes its own 7-Zip/WinRAR extraction guide).
Reading it on screen. Per-execution fees are in Unified Trading Order → Trade History on the web, or on the app under the Trade page → History icon → Trade History tab. The column is labelled Trading Fees. Note the unit: Bybit charges spot fees in the purchased coin (fee = filled quantity × rate), so a BTC buy shows a fee in BTC, while USDT perpetual fees are charged in USDT. The Filled Value column is your notional for the formula below.
| Route | Where | Limits |
|---|---|---|
| Quick export | Orders → Unified Trading Order → product tab → Export | 6 months within last 2 years; 10,000 entries per file; 10 req/day Spot, 5 req/day Derivatives |
| Bulk export | Profile → Account → Data Export → Order History (CSV) | 1 year per export; 50 exports/month; 1–3 days to generate; link valid 7 days; Identity Verification; web only |
| On screen | Unified Trading Order → Trade History (web) / Trade page → History icon → Trade History (app) | Shows Trading Fees per execution; Data Export not available on the app |
On OKX
Web. Go to Assets → Order center and pick Order history, Position history or Trading history, then download in CSV or PDF. The interface shows statements for up to one year, and order and trading history can be downloaded from 28 January 2021 to the present. Downloads are produced on a T+1 basis, so yesterday's trades are not in today's file. This is why it pays to run the audit a day or two into the new month.
App. Tap Trade, choose Spot or Futures, scroll to the positions section and tap the Trade history icon on the right. Under Report type select Order history, choose your time range, instrument and format, then download. If you copy the link instead, it expires one hour after copying.
The columns. The Order history export contains Order Amount, Filled Amount, Amount Unit, Avg. Filled Price, PNL, Fee and Fee Unit. The Trading history export contains Amount, Trading Unit, Filled Price, PnL, Fee and Fee Unit. Fee Unit is the column most people ignore and the one that matters: on spot the fee is charged in the crypto you bought (or taken from the proceeds on a sell), USDT-margined perpetual fees are settled in USDT, and crypto-margined contracts settle the fee in the traded crypto. To see how a single fee was calculated, open Order history, select Details and hover over Fee.
OKX also has a Tax Center (web Assets → My Assets → Tax Center, app Menu → Tax Center) that exports a full transaction history for tax software, but the page is US-localised and availability varies by jurisdiction, so treat it as a regional extra rather than the fee statement.
| Export | Columns you need | Notes |
|---|---|---|
| Order history (CSV/PDF) | Filled Amount, Amount Unit, Avg. Filled Price, Fee, Fee Unit | Web: Assets → Order center; app: Trade → history icon → Download |
| Trading history (CSV/PDF) | Amount, Trading Unit, Filled Price, Fee, Fee Unit | Per-fill rows; downloadable from 28 Jan 2021; T+1 |
| Fee detail on screen | Order history → Details → hover Fee | Shows how the fee was calculated |
On Bitget
Bitget's data export is available only on the website; the app does not support it. Transaction history exports in CSV or Excel, and Order history in PDF, CSV or Excel. Each export request can cover a maximum date range of two years, the Within 6 months option is capped at 10,000 records per request, you may submit up to 100 exports per month, and the download link is valid for seven days. The order history export includes fees.
Which coin the fee is in. USDT-M futures fees are charged in USDT and calculated as order value × fee rate, where order value is quantity × price. Standard spot fees are 0.1% maker / 0.1% taker. The catch is BGB: if you have switched on Use BGB to offset fees in your dashboard, the spot fee is calculated at the discounted rate and deducted from your BGB balance instead, so the fee coin in your export reads BGB. Convert those rows at the BGB price, not the price of the coin you traded.
Bitget also offers a Tax API (keys created under Account → API Management) aimed at tax tools. For a fee audit the CSV is enough, and you never need to create a key for anyone else.
| Export | Formats | Limits |
|---|---|---|
| Transaction history | CSV, Excel | Max 2 years per export; link valid 7 days |
| Order history (includes fees) | PDF, CSV, Excel | Max 2 years per export; 'Within 6 months' capped at 10,000 records; 100 exports/month |
| App | Not supported | Web only |
The one formula
Effective fee rate = Σ (fees converted to USDT) ÷ Σ (filled value in USDT).
Filled value is quantity × fill price. Bybit exports it directly as Filled Value; on OKX multiply Amount (or Filled Amount) by Filled Price; on Bitget multiply the filled quantity by price. For any row where the fee unit is not USDT, convert it first: fee in USDT = fee in coin × the fill price on that same row. In a spreadsheet that is one helper column, one SUM over it, one SUM over filled value, and a division.
Worked example, USDT perpetual (Bybit's own VIP 0 numbers). A 10 BTC fill at 8,000 USDT is 80,000 USDT of notional. As taker the fee is 80,000 × 0.055% = 44 USDT; as maker it is 80,000 × 0.02% = 16 USDT. Now a month: 300,000 USDT of taker notional costs 165 USDT and 200,000 USDT of maker notional costs 40 USDT, so 205 USDT of fees on 500,000 USDT traded gives an effective rate of 0.041%.
Worked example, spot. Buy 0.5 BTC at 40,000 USDT on Bybit at the 0.1% VIP 0 rate. The fee is 0.0005 BTC, deducted from the BTC you receive, and the Trade History column reads 0.0005 BTC. Convert: 0.0005 × 40,000 = 20 USDT on 20,000 USDT of notional, or 0.10%. Sum the BTC figure without converting and your total is wrong by a factor of forty thousand.
What a good number looks like. Your effective rate sits somewhere between your maker and taker rates. The table shows the base schedules the three exchanges publish for a regular account; a 500,000 USDT month of all-taker USDT-perp volume costs 275 USDT on Bybit (0.055%), 250 USDT on OKX (0.05%) and 300 USDT on Bitget (0.06%). Bitget's taker is 0.005 percentage points above the other two, which is 25 USDT per 500,000 USDT of taker notional. Plug your own volume into the Bybit fee calculator to get the same numbers without a spreadsheet.
| Exchange (base tier) | Spot maker / taker | USDT-M perp maker / taker | 500k USDT all-taker perp month |
|---|---|---|---|
| Bybit (VIP 0) | 0.10% / 0.10% | 0.02% / 0.055% | 275 USDT (0.055%) |
| OKX (regular user, global fee page) | 0.08% / 0.10% | 0.02% / 0.05% | 250 USDT (0.05%) |
| Bitget (standard) | 0.10% / 0.10% | 0.02% / 0.06% | 300 USDT (0.06%) |
Reading the number
Maker share. If your effective perp rate is close to the taker rate, you are hitting the book almost every time. OKX's own example makes the arithmetic plain: 1 BTC (100 contracts) at 20,000 USDT costs 10 USDT as taker and 4 USDT as maker, so 500,000 USDT of all-taker volume is 250 USDT (0.05%) while a 50/50 maker-taker mix is 175 USDT (0.035%). The gap between your number and the taker rate is a direct read of how much of your volume was posted rather than taken.
Tier and region. If your number is below the published base rate for your maker share, your account is on a VIP tier or a regional schedule. If it is above, check whether you are looking at the right product table: Bybit prices Options separately (0.02% maker / 0.03% taker at VIP 0), and its help centre tells you to trust the My Fee Rate page over the generic table.
Fee coin. Spot exports mix coins because the fee is taken from what you receive on Bybit and OKX. Bybit's API documents the exact rule: with a positive maker rate a buy pays in the base coin (BTC) and a sell pays in the quote (USDT); the rule flips for maker orders when the maker rate is negative, which only applies to market-maker style accounts. On Bitget the BGB offset switch moves spot fees into BGB. Either way, convert row by row before you sum.
Funding excluded. Funding payments are exchanged between longs and shorts, not paid to the exchange, and they can be positive or negative. Bybit's funding-fee article describes funding rows in Trade History under their own filled type; filter them out of the numerator or label them separately. A rebate applies to trading fees only, never to funding, so mixing them in will also make any rebate estimate wrong.
| Symptom | What it usually means | What to check |
|---|---|---|
| Rate ≈ taker rate | Almost all volume taken | Whether limit orders would fit your style |
| Rate between maker and taker | Mixed execution | Your maker share; OKX 50/50 example = 0.035% |
| Rate below base schedule | VIP tier or regional pricing | Your account's fee-rate page |
| Total looks absurdly small or large | Fees summed in mixed coins | Fee Unit / feeCurrency column, convert at fill price |
| Total swings positive and negative | Funding rows included | Filter out funding before summing |
If you want it automated
All three exchanges expose the same fee data through their public APIs, and you do not need to write code to know which fields to ask for. Create a read-only key for your own script, never give the key to anyone else, and treat any service that wants your keys to "analyse your fees" as a red flag. A CSV export answers the same question without exposing anything.
Bybit. GET /v5/execution/list returns one row per fill with execFee (the fee), feeCurrency and feeRate. A call covers at most seven days (the default window is seven days), with limit 1–100 per page (default 50) and cursor pagination, so a month is five windows. Sum execFee where feeCurrency is USDT and divide by the sum of execQty × execPrice; convert non-USDT fees by the same rule as the spreadsheet.
OKX. GET /api/v5/trade/fills covers the last three days (10 requests per 2 seconds) and GET /api/v5/trade/fills-history the last three months (5 requests per 2 seconds). Both return fee, feeCcy, feeRate, fillFee, fillFeeCcy, fillPx, fillSz and fillPnl. OKX's API changelog has announced changes to the fee/rebate field definitions; check it before relying on field semantics.
Bitget. The UTA endpoint GET /api/v3/trade/fills returns a feeDetail array per fill, each entry carrying feeCoin and fee. The startTime–endTime range must not exceed 30 days, inside a 90-day access window, with a limit of 100 per page and 20 requests per second per UID.
Anything older than the API window has to come from the CSV exports above. Bybit's Tax API (website footer → Services → Tax API, keys expire after three months) and Bitget's Tax API exist for tax software, but a fee audit needs neither.
| Exchange | Endpoint | Fee fields | Window per call |
|---|---|---|---|
| Bybit | GET /v5/execution/list | execFee, feeCurrency, feeRate (+ execQty × execPrice for notional) | ≤ 7 days; limit 1–100; cursor |
| OKX | GET /api/v5/trade/fills · /fills-history | fee, feeCcy, feeRate, fillFee, fillFeeCcy, fillPx, fillSz, fillPnl | 3 days · 3 months; 10 · 5 req/2s |
| Bitget (UTA) | GET /api/v3/trade/fills | feeDetail[].fee, feeDetail[].feeCoin | ≤ 30 days within 90-day window; limit 100; 20 req/s per UID |
Fees are the input you control
Once you have the number, two levers move it: execute more as maker, and get part of the fee back. Rebatly is a registered affiliate of Bybit, OKX and Bitget. Sign up with code REBATLY and Rebatly shares its commission with you as a fee rebate: up to 50% on Bybit and up to 40% on OKX and Bitget, with the tier set by your monthly trading volume (Bybit 40% under $50M, 45% from $50M, 50% from $150M; OKX and Bitget 30% / 35% / 40% at the same thresholds).
The rebate is a share of the trading fees you actually pay, never of funding. Applied to the formula above, a rebate r turns your effective rate into effective × (1 − r): a 0.055% all-taker rate on Bybit at the 40% tier becomes 0.055% × 0.6 = 0.033%, and the 275 USDT month becomes 165 USDT net. Rebates are calculated daily on fees actually paid and sent the next day in USDT by internal transfer into your own exchange account, usually between 04:00 and 12:00 UTC. The minimum payout is 1 USDT and smaller days carry over. Rebatly only ever sees your public exchange UID: no API keys, no passwords, no custody, no deposits. You can check each day's rebate in the Telegram bot t.me/rebatlybot, and reach support at t.me/rebatly or hello@rebatly.io.
Next reads: how to reduce crypto trading fees for the maker-share lever, funding rate vs trading fees for the rows you should leave out, the Bybit fee calculator to model a month before you trade it, and the guides index for the rest.
Rebatly is an independent affiliate funded from its commission; not financial advice.
Guides
$10M+ rebates paid · Paid daily in USDT · No password or API keys, ever
Already signed up? Message @rebatly and we'll confirm you're linked.
September 14, 2026 — published. Menu paths, export formats and limits, fee-coin rules, base fee schedules and API endpoint field names checked against the Bybit, OKX and Bitget help centres and API documentation on September 14, 2026.
FAQ
Is the fee column in my export already in USDT?
Not always. On Bybit and OKX, spot fees are charged in the coin you receive, so a BTC buy shows a fee in BTC; USDT-margined perpetual fees are in USDT on all three. Bitget spot fees move into BGB if you have the BGB offset switched on. Read the fee-unit column (Fee Unit on OKX, feeCurrency or feeCoin in the APIs) and convert each row at its fill price before summing.
Should funding payments be included in my fee total?
No. Funding is exchanged between long and short positions, can be positive or negative, and is not a trading fee. Bybit's funding-fee article describes funding rows in Trade History under their own filled type. Leave it out of the effective fee rate, and remember that rebates apply to trading fees only, never to funding.
Why doesn't my effective rate match the exchange's published table?
Four common reasons: your maker/taker mix (the effective rate sits between the two), a VIP tier, regional pricing (Bybit tells you to check My Fee Rate; OKX's Singapore and global fee pages show different spot schedules), or a fee coin you have not converted. Benchmark against your own account's fee-rate page, not the generic table.
Can I export my fee history from the app?
OKX yes: Trade → Spot or Futures → Trade history icon → Order history → Download. Bybit: the bulk Data Export is website only and requires Identity Verification; the quick Export under Orders → Unified Trading Order is documented for the website. Bitget: export is website only. You can still view per-fill fees on the Bybit app under Trade → History icon → Trade History.
Do I need to give anyone my API keys to audit fees?
No. The CSV exports contain every fee, and if you script it you only need a read-only key for your own use. Rebatly never asks for API keys, passwords or deposits; it only sees your public exchange UID, and rebates arrive by internal transfer into your own exchange account.