Staring at My Screen: My Bybit Tax Panic
It was mid-February, the kind of day when Toronto feels like a freezer with wind tunnels between the office towers. I was sitting at my kitchen table in East York with a medium double-double from Tim Hortons growing cold beside my laptop, staring out at the gray snowdrifts piling up on my balcony. My phone buzzed with a calendar reminder: “Tax season prep.” My stomach dropped.
Back in 2023, I’d traded on Bybit pretty actively-nothing crazy, but enough to matter. Then the Ontario Securities Commission crackdown happened, and Bybit started restricting access for Canadian users. I thought, “Well, that’s that.” But it wasn’t. I still had to file taxes on everything I’d done there, and now I was facing the nightmare scenario: trying to pull historical transaction data from a platform that no longer wanted Canadian customers.
I’d spent weeks avoiding this moment. The truth is, I didn’t know where to start. Did Bybit report to the CRA? Could I just ignore it? How the hell was I supposed to export years of trades from a platform that was basically ghosting me?
What I Discovered About Bybit and the CRA
Before I panicked any further, I did some research. Here’s what I actually learned:
- Bybit doesn’t send T5008 slips: Unlike a Canadian stock broker, Bybit never mailed me (or the CRA) an official Statement of Securities Transactions. I was completely on my own.
- The CRA can trace your moves: The taxman uses something called Unnamed Persons Requirements (UPRs) to squeeze data out of foreign exchanges. If I’d transferred crypto from Shakepay (which is KYC-compliant and Canadian) to Bybit, that paper trail was visible.
- The T1135 threshold is real: If my foreign crypto holdings ever hit $100,000 CAD in total cost, I had to file Form T1135. That’s more than most Toronto condos cost per square foot, but somehow less than a year of parking in this city.
- I had to self-report everything: No form letter, no official document from the exchange. Just me, my calculator, and the CRA’s rulebook.
Does Bybit Secretly Chat With the Taxman?
This was the question keeping me up at night. I kept imagining the CRA and Bybit having some secret partnership, silently sharing all my trades. The reality, I learned, was both better and worse.
Bybit is not registered with any Canadian securities regulator-not the Ontario Securities Commission, not the Alberta Securities Commission, nothing. That’s why they pulled out of Canada in the first place. The OSC basically said, “You can’t operate here without registering,” and Bybit said, “Nope, we’re out.” From a regulatory standpoint, Bybit was in the wind.
But here’s the catch: lack of regulation doesn’t equal invisibility. The CRA has legal tools to demand data from foreign exchanges, especially if they suspect tax evasion. And if I’d moved money from a Canadian exchange to Bybit, that transaction was already recorded somewhere in the Canadian banking system. The CRA could connect those dots if they wanted to.
Now, keep in mind, I’m just a guy typing this on my laptop in my Toronto apartment, not a certified accountant or a tax attorney. You should definitely check with a professional if you’re unsure, but here is how I understood the rules. The CRA doesn’t need Bybit to report me-they have other ways of finding out what I did. And the smartest move is to report it myself before they come looking.
Then there’s the T1135 form, which scared me the most. If the total cost of my “specified foreign property”-which includes crypto sitting on Bybit-exceeded $100,000 CAD at any point in the year, I had to file this form with my tax return. I did a quick mental calculation. At the peak of my holdings in summer 2023, I’d probably hit that number. That was enough to push me into action.
Method 1: How I Linked My Bybit API (The Automated Attempt)
I decided to try the API route first because it sounded easier than manually downloading CSVs for three years of trading. The idea was simple: create a read-only key that tax software could use to automatically pull my transaction history. No messing around with spreadsheets, no risk of duplicates or missing data.
The first step was finding where the hell the API settings were. I logged into Bybit and spent five minutes clicking around like an idiot before I found it: hover over my profile icon in the top right corner, and there’s the API menu.
Finding the Key Settings
I clicked on “Create New Key” and saw two options: “System-generated API Keys” or “Third-party applications.” I chose system-generated because it felt more secure-I wanted Bybit to manage the key, not trust a third party.
The next screen asked me to name the key. I called it “TaxMaxEnabled” because I wanted to remember what it was for. I also had to pick the key type: I selected “API Transaction.”
Now came the critical part, and this is where I almost messed up. I had to set the permissions.
Choosing the Safest Permissions
Bybit was asking me which data the tax software could access and, more importantly, what it could do with my account. This was where security mattered.
The first checkbox was the big one: Read-Only. I made absolutely sure to check that box and leave “Read-Write” unchecked. I didn’t want any software touching my actual account, moving my funds, or executing trades on my behalf. Read-only meant it could see my data but couldn’t touch anything. That alone made me sleep better at night.
Next, I had to select which data the key could read. Bybit showed me a list: Spot, Derivatives, UTA (Unified Trading Account), Block Trade, Orders, Positions. Since I’d traded spot crypto, done some futures, and had assets in both old and new account types, I checked all of them. Better to have the data and not need it than miss something important.
Once I clicked submit and verified the request with my two-factor authentication (which Bybit made me do for security), the system showed me my API Key and API Secret. This was the only time Bybit would display the Secret, so I copied both strings immediately and pasted them into a secure note app. I did not screenshot them, did not email them to myself, and definitely did not write them down on sticky notes.
Method 2: Grabbing My CSVs (The Manual Slog)
I tried linking that API key to a tax software tool, but it didn’t work. The software kept timing out, saying it couldn’t sync with Bybit. I waited a day and tried again. Same problem. I checked Bybit’s API status page and saw nothing wrong on their end.
So I switched to Plan B: manually downloading CSV files. This is the boring, tedious, spreadsheet route. It sounded like hell, but I was determined.
Hunting Down the Trades vs. Orders
I went to Bybit’s Orders menu and saw two tabs: “Order History” and “Trade History.” This was the moment I almost made a huge mistake. I quickly learned that grabbing just my “Order History” wasn’t enough; I actually needed the “Trade History.”
Here’s why: Order History shows every order I placed, including ones that never filled. Trade History shows only the orders that actually executed-the real transactions with the actual prices and fees I paid. For tax purposes, I needed Trade History because that’s what determined my actual cost basis and realized gains or losses.
I navigated to the Trade History section and saw all my old trades listed out. The timestamp, the crypto pair, the quantity, the price, the fees. This was gold. I hit the Export button in the top right corner.
The Date Range Obstacle Course
Here’s where Bybit made my life difficult. The export feature wouldn’t let me grab three years of data all at once. Instead, it limited me to either a 3-month or 6-month range, depending on the account type. This meant I had to generate multiple files, each covering a different time period.
I started with January to June 2023, then July to December 2023, then January to June 2024. I made absolutely sure not to overlap the dates, because if June was in both files, I’d end up with duplicate transactions in my tax calculations. That would be a nightmare to debug.
The downloads came as CSV files, which I saved with clearly labeled names like “Bybit_Spot_Trades_Jan-Jun-2023.csv” and “Bybit_Spot_Trades_Jul-Dec-2023.csv.” I also downloaded my derivatives history separately, because Bybit treated futures trades differently than spot trades.
Don’t Forget My Deposits and Funding Fees
Most people forget this step, and I almost did too. Trading wasn’t my only taxable event. I also had deposits (transfers in from my wallet or another exchange) and withdrawals (transfers out to take profits or move to cold storage).
I navigated to Assets, then my Funding Account, and looked for the History section. I exported my “Deposit” history to show where my cost basis came from. If I’d transferred 5 BTC from Coinbase to Bybit, that deposit was my starting point-it proved when the coins arrived and what exchange I came from.
I also grabbed my “Withdrawal” history. Every time I moved crypto off Bybit, that was a taxable event (assuming I’d made a profit or loss). The withdrawal record showed exactly when I left and how much I took.
Finally, I exported my “Funding Fees” history. I’d traded derivatives on Bybit, and those came with funding rates-fees I paid to maintain my position. These funding fees could be deducted as expenses, which would lower my overall profit. The CRA cared about my net profit, not my gross, so these fees mattered.
My Battle with Unified Accounts and Other Weird Errors
Once I had all my CSVs, I tried to import them into a spreadsheet to organize everything. This is when things got weird.
I noticed that around November 2023, my balance suddenly showed as zero, then bounced back up. At first, I thought something was wrong with my data or that I’d gotten hacked. I was about to have a panic attack.
Then I remembered: Bybit had announced a migration to something called the Unified Trading Account (UTA) back in 2023. The UTA combined your spot account, futures account, and derivatives account into one big wallet. For users like me who didn’t upgrade manually, Bybit did it automatically. The system treated the migration as an internal transfer-not a sale of my assets, just a reorganization.
But the way the CSV reported it, it looked like I’d sold everything and bought it all back at the exact same price. If I’d imported that into tax software without understanding what happened, I would have created ghost trades that didn’t actually happen. That’s a nightmare scenario for tax filing.
I fixed it by marking that date as a “special event” in my calculations-not a trade, just an account upgrade. I manually adjusted my spreadsheet to show that my assets moved between account types but didn’t get disposed of.
Then there was the inverse futures problem. I’d traded some inverse contracts on Bybit, which are contracts that pay you in the actual cryptocurrency (like BTC) instead of stablecoins (like USDT). When I closed a profitable position, my CSV showed a profit of, say, 0.1 BTC. But that wasn’t my profit in CAD-it was my profit in Bitcoin.
To calculate my tax in Canadian dollars, I needed to know the price of BTC at the exact moment my position closed. If BTC was worth $70,000 CAD when I closed the trade, then 0.1 BTC was worth $7,000 CAD in profit. The CSVs didn’t automatically do this conversion, so I had to manually add the BTC price at that timestamp and then calculate the CAD equivalent. This is tedious and error-prone, which is why I eventually decided to use proper tax software instead of raw spreadsheets.
The ACB Trap: Why FIFO Screwed Me Over
I was sitting on the TTC subway riding from Coxwell Station down to Union Station one morning, scrolling through the CRA’s official guide to cryptocurrency taxation on my phone like some kind of commuter nerd. The guide kept mentioning something called “Adjusted Cost Base,” and I realized I’d been doing my calculations all wrong.
Most of the generic advice I’d found online talked about using FIFO-First-In, First-Out. This is how American taxes work: you assume you sell the oldest coins you bought first, and the profit or loss is calculated based on the difference between the old purchase price and the selling price. Simple, right?
Canada doesn’t do FIFO. Canada requires Adjusted Cost Base, or ACB. This is a completely different method, and it’s way more complicated.
Here’s how ACB works: imagine I bought 1 BTC at $10,000, then later bought another 1 BTC at $50,000. According to ACB, I don’t have two separate BTC-I have a pool of 2 BTC with an average cost of $30,000 each. When I sell 1 BTC for $80,000, my profit is $50,000 (not $70,000 like FIFO would suggest). This matters because it changes how much tax I owe.
But here’s the thing: calculating ACB manually from raw Bybit CSVs is insanely difficult. Every single trade affects the average cost. Every deposit and withdrawal changes the pool size. Every fee adjusts the cost basis. If I have hundreds of trades across spot and derivatives, doing this in Excel is a recipe for disaster.
Again, I’m just a DIY enthusiast sharing my own experiences trying to stay on the CRA’s good side. If your portfolio looks like a high-frequency trading firm with thousands of trades, do yourself a favor and get a real CPA who understands crypto. But for someone like me with moderate activity, the solution was to use Canadian-friendly tax software that actually supports ACB calculations. These tools handle the rolling average math automatically, which means I don’t have to manually track every single adjustment.
I realized that trying to DIY this part with a spreadsheet would probably land me in trouble. The CRA audits crypto traders, especially ones who show inconsistent profit calculations. If my ACB was wrong, the adjustment would flow through to my entire tax return. I wasn’t willing to take that risk.
Max’s DIY Tip: The Spreadsheet Saver
Even though I ended up using tax software, I still created a master spreadsheet to organize all my raw CSV data. This turned out to be one of the smartest things I did.
I created a single Google Sheet and made separate tabs for each export file: “Bybit_Spot_Jan-Jun-2023,” “Bybit_Spot_Jul-Dec-2023,” “Bybit_Derivatives_Jan-Jun-2023,” and so on. I color-coded each tab so I could visually see which periods I’d already imported and which ones were still pending.
In each tab, I added a status column with three options: “Raw Import,” “Reviewed,” or “Uploaded to Tax Software.” This helped me track my progress and made sure I didn’t accidentally skip a file or import something twice.
I also kept a master checklist at the top of the sheet: Spot Trades, Derivatives Trades, Deposits, Withdrawals, Funding Fees, UTA Migration Date, Inverse Contract Closures. As I handled each category, I’d mark it off. By the end, I had a complete record of everything I’d processed.
This approach turned what could have been a chaotic nightmare into a manageable project. When the CRA eventually asks questions (and they might), I can point to my organized files and explain exactly what I reported and why.
Max’s DIY Checklist for Bybit Tax Prep
If you’re in the same boat as I was, here’s the checklist I wish I’d followed from day one:
- Gather all your data first. Try the API route if you can, but have the CSV backup ready. Download Trade History (not Order History), Deposits, Withdrawals, and Funding Fees. Make sure you cover the entire tax year and don’t overlap dates.
- Organize your files like you mean it. Create a master spreadsheet with clear labels and status tracking. This isn’t optional-you’ll thank yourself later when you’re trying to remember what you downloaded and when.
- Check for account migrations and special events. Did you upgrade to UTA? Did Bybit reorganize your account? Document these separately so you don’t accidentally create fake trades in your tax calculation.
- Calculate or import into Canadian tax software. Don’t try to hand-calculate your ACB using FIFO. Use software that understands Canadian ACB rules. It’s worth the cost to avoid an audit.
- Cross-reference your cost basis. Make sure your opening balance matches what you know you had in the account on January 1. If deposits and withdrawals are missing, your cost basis will be wrong, and your entire return will be thrown off.
Wrapping It All Up
Dealing with Bybit taxes as a Canadian is legitimately stressful. The platform doesn’t report to the CRA, the OSC made sure they’re basically inaccessible now, and the trading features are complex enough that a simple FIFO calculation won’t cut it. For weeks, I felt like I was drowning in CSV files and API documentation that made my head hurt.
But here’s what I learned: the data is there if you know where to look, and the CRA’s rules are actually logical once you understand them. I pulled my API key, downloaded my CSVs, organized my files, spotted the UTA migration issue, and eventually got my ACB calculations in order. It took a few days of work, but I finally had confidence that my tax filing would be accurate.
The biggest thing I wish someone had told me earlier is that you shouldn’t stress about this alone. If your situation is complicated or you’re worried about making a mistake, hire a crypto-savvy accountant for a few hours. They can review your data, confirm your calculations, and give you peace of mind. That’s way cheaper than an audit.
If you’re reading this and you’re in the same situation-stuck with Bybit data you need to report-start today. Don’t wait until the tax deadline is breathing down your neck like I almost did. Pull your data, organize it, and get it sorted out while you still have time to fix any mistakes. Your future self will be incredibly grateful.
Have questions about your own Bybit situation? Post them in the community section of this site or reach out directly. I’m not a tax professional, but I’ve been through the wringer with this exact problem, and I’m happy to help other Torontonians navigate the same mess. We’re all in this together, and sometimes the best advice comes from someone who’s already made all the mistakes.