Bybit provides high-quality historical market data, including:
- Full trade history
- Deep L2 order books
- Spot & derivatives markets
The downside is that downloading this data manually is painful — lots of UI clicks, symbol/date selection, and repeating the same workflow over and over.
This tool automates the entire Bybit download flow using Playwright:
- handles all UI interaction for you
- selects symbols and date ranges
- downloads and saves data locally
The goal is to make historical data collection fast, repeatable, and hands-off.
🚧 Fresh release — expect rough edges
Bybit UI changes and browser automation can be flaky. If something breaks:
- try running with
--no-headlessto see the browser - reduce
--chunk-daysif downloads fail
Bug reports and PRs are welcome.
Use WSL (Ubuntu) or a Linux machine.
From the project root, run:
chmod +x setup.sh
./setup.sh
source .venv/bin/activate
export PYTHONPATH=$PWD/src
That’s it — no manual downloads, cookies, or browser setup required.
Entry point:
src/main.py
General syntax:
python -m src.main [GLOBAL OPTIONS] <command> [COMMAND OPTIONS]
| Flag | Description |
|---|---|
--browser |
firefox (default), chromium, webkit |
--headless / --no-headless |
Run browser headless (default: headless) |
python -m src.main symbols spot
python -m src.main symbols contract
Spot trades example
python -m src.main download spot trades \
--symbol BTCUSDT \
--start 2025-01-03 \
--end 2026-01-03 \
--out ./data \
--chunk-days 5
Contract L2 order book example
python -m src.main download contract l2book \
--symbol BTCUSDT \
--start 2025-01-03 \
--end 2026-01-03 \
--out ./data \
--chunk-days 5
- trades
- l2book
chunk-days MUST be < 6
This is a Bybit UI limitation.
The CLI will error if you exceed it.
You can also use this directly in Python:
from src.client import BybitHistoryClient
import asyncio
async def run():
async with BybitHistoryClient() as c:
await c.download_data(
margin="Spot",
data_type="Trades",
symbol="BTCUSDT",
start_date="2026-01-01",
end_date="2026-01-03",
final_path="./data",
chunk_days=5,
)
asyncio.run(run())
This tool automates Bybit’s public web UI.
Use responsibly and at your own risk.