{"record":{"id":"217d34f48c091ca5","repo":"nautechsystems/nautilus_trader","slug":"no-rpi-order-book-returned-from-okx","errorCode":null,"errorMessage":"No RPI order book returned from OKX","messagePattern":"No RPI order book returned from OKX","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/okx/src/http/client.rs","lineNumber":2967,"sourceCode":"        &self,\n        instrument_id: InstrumentId,\n        depth: Option<u32>,\n    ) -> anyhow::Result<OrderBook> {\n        let inst = self.instrument_from_cache_by_id(instrument_id)?;\n        let price_precision = inst.price_precision();\n        let size_precision = inst.size_precision();\n        let params = GetRpiOrderBookParams {\n            inst_id: instrument_id.symbol.to_string(),\n            sz: depth,\n        };\n        let resp = self\n            .inner\n            .get_rpi_order_book(params)\n            .await\n            .map_err(|e| anyhow::anyhow!(e))?;\n        let snapshot = resp\n            .first()\n            .ok_or_else(|| anyhow::anyhow!(\"No RPI order book returned from OKX\"))?;\n        let ts_event = UnixNanos::from(snapshot.ts * NANOSECONDS_IN_MILLISECOND);\n        let mut book = OrderBook::new(instrument_id, BookType::L2_MBP);\n\n        for (i, level) in snapshot.bids.iter().enumerate() {\n            let price = Price::from_decimal_dp(level.0, price_precision)?;\n            let size = Quantity::from_decimal_dp(level.1, size_precision)?;\n            let order = BookOrder::new(OrderSide::Buy, price, size, i as u64);\n            book.add(order, 0, i as u64, ts_event);\n        }\n\n        let bids_len = snapshot.bids.len();\n        for (i, level) in snapshot.asks.iter().enumerate() {\n            let price = Price::from_decimal_dp(level.0, price_precision)?;\n            let size = Quantity::from_decimal_dp(level.1, size_precision)?;\n            let index = (bids_len + i) as u64;\n            let order = BookOrder::new(OrderSide::Sell, price, size, index);\n            book.add(order, 0, index, ts_event);\n        }","sourceCodeStart":2949,"sourceCodeEnd":2985,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/okx/src/http/client.rs#L2949-L2985","documentation":"request_rpi_order_book_snapshot calls OKX's RPI (retail price improvement) order book endpoint and expects one snapshot; an empty data array triggers this error, mirroring the regular order book path but for the RPI book variant.","triggerScenarios":"Calling the RPI order book request for an instrument that has no RPI book data (unsupported instrument type, empty response from get_rpi_order_book), or an invalid instId.","commonSituations":"Requesting RPI books for instruments that don't support the RPI program, using an adapter/endpoint combination where OKX returns data: [] for the RPI depth endpoint, or polling a suspended instrument.","solutions":["Confirm the instrument supports OKX's RPI order book before requesting it.","Fall back to the standard order book endpoint when the RPI book is unavailable.","Verify the inst_id is valid and currently trading.","Handle the empty case gracefully (skip or retry) instead of surfacing it as fatal."],"exampleFix":"// before\nlet snapshot = resp.first().ok_or_else(|| anyhow::anyhow!(\"No RPI order book returned from OKX\"))?;\n// after\nlet Some(snapshot) = resp.first() else {\n    tracing::debug!(\"no RPI book for {instrument_id}, falling back to standard book\");\n    return self.request_book_snapshot(instrument_id, depth, ts_init).await;\n};","handlingStrategy":"fallback","validationCode":"if !supports_rpi(inst_type) {\n    return self.request_book_snapshot(instrument_id, depth, ts_init).await;\n}","typeGuard":null,"tryCatchPattern":"let Some(snapshot) = resp.first() else {\n    tracing::debug!(\"no RPI book; falling back to standard order book\");\n    return self.request_book_snapshot(instrument_id, depth, ts_init).await;\n};","preventionTips":["Only request the RPI book for instrument types that support OKX's RPI program.","Provide a standard order book fallback path.","Treat empty RPI responses as informational, not fatal."],"tags":["okx","orderbook","rpi","empty-response"],"backgroundTag":"empty-result-set","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}