nautechsystems/nautilus_trader · error

Lighter does not support historical quote requests for {}; s

Error message

Lighter does not support historical quote requests for {}; subscribe to quotes via WebSocket for live BBO ticks

What it means

The Lighter data client does not implement historical (REST) quote requests: quotes are only streamed as live BBO ticks over WebSocket. request_quotes always bails with this message naming the requested instrument. It is an explicit capability gap, not a transient failure.

Source

Thrown at crates/adapters/lighter/src/data/mod.rs:1633

                        clock.get_time_ns(),
                        params,
                    ));

                    if let Err(e) = sender.send(DataEvent::Response(response)) {
                        log::error!("Failed to send bars response: {e}");
                    }
                }
                Err(e) => {
                    log::error!("Lighter bars request failed for {instrument_id}: {e:?}");
                }
            }
        });

        Ok(())
    }

    fn request_quotes(&self, request: RequestQuotes) -> anyhow::Result<()> {
        anyhow::bail!(
            "Lighter does not support historical quote requests for {}; \
             subscribe to quotes via WebSocket for live BBO ticks",
            request.instrument_id,
        )
    }

    fn request_trades(&self, request: RequestTrades) -> anyhow::Result<()> {
        let instrument_id = request.instrument_id;
        log::debug!("Requesting Lighter trades for {instrument_id}");

        let instrument = self
            .instruments
            .get_cloned(&instrument_id)
            .ok_or_else(|| InstrumentLookupError::not_found(instrument_id))?;

        let http = self.http_client.clone();
        let sender = self.data_sender.clone();
        let request_id = request.request_id;

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Subscribe to the live quote stream (subscribe_quotes) instead of requesting history.
  2. If historical quotes are required, capture them yourself via the WS stream into a cache/backing store and query that.
  3. Use historical trades or bars (which Lighter does support) as a proxy for historical BBO where acceptable.
  4. Guard the call site: skip request_quotes for instruments on the Lighter venue.

Example fix

// before
data_engine.request(RequestQuotes::new(instrument_id, start, end, callback))
// after
data_engine.subscribe_quotes(instrument_id) // live BBO via WebSocket; history not available on Lighter
Defensive patterns

Strategy: fallback

Try / catch

// venue-agnostic path
if request.instrument_id.venue.as_str() == "LIGHTER" {
    data_engine.subscribe_quotes(request.instrument_id)?; // live only
} else {
    data_engine.request_quotes(request)?;
}

Prevention

When it happens

Trigger: Calling request_quotes (e.g. via DataEngine.request or a RequestQuotes message) for any Lighter instrument, whether from a strategy warming up historical quote data or a backtest/live bridge requesting quote history.

Common situations: Strategies that request historical quotes before subscribing; code shared across venues where other adapters support quote history but Lighter does not; data pipelines assuming uniform historical support.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/3325264510e5d578. Report an issue: GitHub.