Lighter Tick Trade Dataset

Lighter Historical Tick Trade Data

Lighter public trade executions from spot and perpetual markets, normalized into the same tick schema used across CryptoHFTData venues.

No credit card · The sample is one real hourly Parquet file and needs no API key

Is this the right dataset?

What “tick data” means on this page

Tick data is an overloaded term. This page owns downloadable execution-level trade history; ticker statistics and L2 order book changes are separate datasets.

Sample

See the data before you sign up

The first rows of one real hour: BTC on Lighter, 2026-09-02 at 12:00 UTC. One row per public trade as published by the venue.

lighter/2026-09-02/12/BTC_trades.parquetDownload full file
received_timeevent_timesymboltrade_idpricequantitytrade_timeis_buyer_makerorder_type
17883504000135159801788350399850BTC2921694997676801.90.000201788350399850falsetrade
17883504000622481651788350399927BTC2921695003376801.90.000651788350399927falsetrade
17883504002381765571788350400093BTC2921695043476799.90.000451788350400093falsetrade
17883504002742038991788350400115BTC2921695063776799.00.000931788350400115falsetrade
17883504002742038991788350400115BTC2921695063876800.20.000071788350400115falsetrade
17883504003006352911788350400149BTC2921695076176797.10.191041788350400149truetrade
Showing 6 of 19,373 rows in this hourTimestamps are raw integers; units are in the schema below

Wire format

From exchange message to Parquet row

Every row starts as a message on the exchange's WebSocket or REST API. Point at a line or a column to see where each value comes from and how we convert it. Our test suite replays these messages through the production pipeline, so the rows shown are the rows you download.

Lighter (Perpetuals & Spot)

One frame can contain several trades. Each trade becomes a separate row. We sort the rows by trade_time, then by trade_id.

Exchange sends

WebSocket message · trade/<index>received 2026-10-05 19:15:04.723749 UTC

{
"channel": "trade:1",
"liquidation_trades": [],
"nonce": 23863348794,
"trades": [
{
"trade_id": 33380750090,
"trade_id_str": "33380750090",
"tx_hash": "0000001ea5bde783000001a10d7db4e4000000000000000000000000000000000000000000000000",
"type": "trade",
"market_id": 1,
"market_kind": "perps",
"size": "0.00010",
"price": "85636.3",
"usd_amount": "8.563630",
"ask_id": 562953487717055,
"ask_id_str": "562953487717055",
"bid_id": 844421361202466,
"bid_id_str": "844421361202466",
"ask_client_id": 31938461114236,
"ask_client_id_str": "31938461114236",
"bid_client_id": 5434,
"bid_client_id_str": "5434",
"ask_account_id": 702384,
"bid_account_id": 750305,
"is_maker_ask": true,
"block_height": 349153116,
"timestamp": 1791227704548,
"taker_position_size_before": "-0.00001",
"taker_entry_quote_before": "0.856509",
"taker_initial_margin_fraction_before": 500,
"taker_position_sign_changed": true,
"maker_fee": 28,
"maker_position_size_before": "39.75775",
"maker_entry_quote_before": "3398551.295093",
"maker_initial_margin_fraction_before": 3333,
"transaction_time": 1791227704597066,
"ask_order_version": 0,
"bid_order_version": 0
},
{
"trade_id": 33380750089,
"trade_id_str": "33380750089",
"tx_hash": "b5313d3bcb15bfa14b7c18ea21330d3e0efdf5ba80874c3e478f9fcfd641d10e248218a5ffabf4ce",
"type": "trade",
"market_id": 1,
"market_kind": "perps",
"size": "0.00031",
"price": "85635.5",
"usd_amount": "26.547005",
"ask_id": 562953487717054,
"ask_id_str": "562953487717054",
"bid_id": 844421361202466,
"bid_id_str": "844421361202466",
"ask_client_id": 34120,
"ask_client_id_str": "34120",
"bid_client_id": 5434,
"bid_client_id_str": "5434",
"ask_account_id": 281474976623775,
"bid_account_id": 750305,
"is_maker_ask": true,
"block_height": 349153116,
"timestamp": 1791227704548,
"taker_position_size_before": "-0.00032",
"taker_entry_quote_before": "27.408314",
"taker_initial_margin_fraction_before": 500,
"maker_fee": 36,
"maker_position_size_before": "1.36744",
"maker_entry_quote_before": "117314.743225",
"maker_initial_margin_fraction_before": 2000,
"transaction_time": 1791227704596967,
"ask_order_version": 0,
"bid_order_version": 0
}
],
"type": "update/trade"
}

You download

Parquet row · trades · 1 of 2 rows from this message

Point at a line in the message or a column in the row to trace where each value comes from. Click a column to pin it.

Our tests replay this message through the production pipeline

All Lighter (Perpetuals & Spot) mapping rules →

Conventions for every exchange are in the wire formats overview. Column types and units for tick trade data are in the schema below.

Use cases

What you can build with tick trade data

Order flow and taker imbalance
Split volume into aggressive buys and sells with is_buyer_maker to build trade-flow imbalance and toxicity signals.
VWAP and execution benchmarks
Compute VWAP, realized spread, and slippage from every print rather than from pre-aggregated candles.
Tick, volume, and dollar bars
Build any bar type from raw executions, so your sampling is not locked to a vendor's candle interval.

Coverage

Tick trade coverage

Every venue is stored under its own exchange ID, so spot and derivatives never mix. Bars show each venue's history from its first hourly file to today, or to its last file for a venue that is no longer collected. Symbol counts are live from the symbols API.

Tick trade coverage by venue, exchange ID, market, history start, and live symbol count
VenueExchange IDMarketHistoryTick trade symbols
LighterlighterPerpetuals & Spot
2025-12-3010 mo
235

Other exchanges

Tick Trades data on other exchanges

The same schema on every venue, so switching exchange is a one-argument change.

Or compare every venue on the cross-exchange tick trade overview.

Schema · 9 columns

Normalized tick trade schema

Every row is one public trade as published by the exchange, with exchange timing, trade ID, exact price and quantity strings, buyer-maker status, and order type. On most venues a row is one execution; OKX history before the 2026-09 data-integrity release aggregates fills per taker order and price.

Columns in every tick trade Parquet file
ColumnTypeDescription
received_timeINT64Unix timestamp (nanoseconds) when our system received the trade event
event_timeINT64Unix timestamp when the exchange generated the event (the time unit changes with the exchange)
symbolSTRINGTrading pair symbol (for example, 'BTCUSDT')
trade_idINT64Exchange-specific trade identifier. For OKX history before the 2026-09 data-integrity release, it is the last fill ID of an aggregated row (refer to the venue notes)
priceSTRINGTrade execution price (stored as string for precision)
quantitySTRINGTrade size (stored as string for precision). The unit is the base asset on most venues. OKX derivatives use contracts, and BitMEX uses raw instrument units (refer to the venue notes)
trade_timeINT64Unix timestamp when the trade occurred (the time unit changes with the exchange)
is_buyer_makerBOOLEANTrue if the buyer was the maker (passive side), false if the buyer was the taker
order_typeSTRINGType of order that caused this trade (for example, "LIMIT", "MARKET"), if the venue publishes it. Binance spot does not publish an order type. Thus, the column is always "MARKET" there as a placeholder

Quickstart

From pip install to DataFrame in a minute

The example loads BTC from Lighter for 2026-09-02. Change the symbol, exchange, or dates to pull any other slice of the archive.

  1. Install the Python SDK

    pip install cryptohftdata
  2. Create a free API key

    Sign up with email or Google, then generate a key from your dashboard. No credit card.

    Create account
  3. Call get_trades()

    Paste the snippet, replace YOUR_API_KEY, and you get a pandas DataFrame with the columns listed above.

lighter_trades_data.py
import cryptohftdata as chd

client = chd.CryptoHFTDataClient(api_key="YOUR_API_KEY")

df = client.get_trades(
    symbol="BTC",
    exchange=chd.exchanges.LIGHTER,
    start_date="2026-09-02",
    end_date="2026-09-02",
)

print(df.head())
print(f"Tick trades: {len(df):,}")
REST · no API key needed for single files
curl --fail --location \
  "https://api.cryptohftdata.com/download?file=lighter/2026-09-02/12/BTC_trades.parquet" \
  -o BTC_trades_12.parquet

Caveats

Know this before you backtest

Exchange feeds differ in subtle ways. These are the details that matter for accurate backtests, replay pipelines, and features. Missing hours and pending corrections for every venue are listed on Known Gaps & Corrections.

  1. Each row is a public tick trade as published by the exchange; trade ID semantics and aggregation behavior vary by venue.

  2. is_buyer_maker identifies the passive side. True means the buyer rested and the seller took liquidity; false means the buyer took liquidity.

  3. received_time is recorded in nanoseconds, while exchange event_time and trade_time units are venue dependent. Inspect and normalize timestamp units before joining feeds.

  4. Prices and quantities are stored as strings to preserve exchange precision; cast to decimals or floats as needed.

  5. OKX trades before the 2026-09 data-integrity release are one row per taker order per price level (fills aggregated by the exchange), not one row per fill; from the release they are one row per fill.

  6. Binance spot publishes no order type on its trade stream, so order_type is always MARKET there as a placeholder.

  7. This page starts on 2025-12-30 based on the earliest stored hourly files for its covered exchange IDs and grows as new hourly files are published.

FAQ

Frequently asked questions

Is Lighter tick trade data free to download?

Yes. A free CryptoHFTData account with no credit card gives API access to Lighter tick trade data and every other dataset. Individual hourly files can also be downloaded without an API key on the rate-limited free tier.

How far back does Lighter tick trade data go?

The earliest hourly files start on 2025-12-30, and new files are added every hour. Start dates differ by venue; the coverage table on this page lists each one.

What format are the files in?

Each file holds one symbol for one UTC hour, stored as Zstd-compressed Parquet under {exchange_id}/{YYYY-MM-DD}/{HH}/{SYMBOL}_trades.parquet. Parquet reads directly into pandas, Polars, DuckDB, and Arrow.

How do I load Lighter tick trade data in Python?

Install the SDK with pip install cryptohftdata, create a client with your API key, and call client.get_trades() with a symbol, exchange, and date range. It returns a pandas DataFrame.

What does is_buyer_maker mean?

It identifies the passive side of the trade. True means the buyer's order was resting on the book and the seller took liquidity; false means the buyer was the aggressor.

Start using tick trade data today.

One free API key covers every exchange and every data type. $0.00.