{"record":{"id":"237be177e7e52fe7","repo":"nautechsystems/nautilus_trader","slug":"failed-to-get-open-orders-error-msg","errorCode":null,"errorMessage":"Failed to get open orders: {error_msg}","messagePattern":"Failed to get open orders: (.+?)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/http/futures/client.rs","lineNumber":1691,"sourceCode":"        instrument_id: Option<InstrumentId>,\n        start: Option<Timestamp>,\n        end: Option<Timestamp>,\n        open_only: bool,\n    ) -> anyhow::Result<Vec<OrderStatusReport>> {\n        let ts_init = self.generate_ts_init();\n        let mut all_reports = Vec::new();\n\n        let response = self\n            .inner\n            .get_open_orders()\n            .await\n            .map_err(|e| anyhow::anyhow!(\"get_open_orders failed: {e}\"))?;\n\n        if response.result != KrakenApiResult::Success {\n            let error_msg = response\n                .error\n                .unwrap_or_else(|| \"Unknown error\".to_string());\n            anyhow::bail!(\"Failed to get open orders: {error_msg}\");\n        }\n\n        let position_sizes = if response\n            .open_orders\n            .iter()\n            .any(|order| order.unfilled_size.is_none())\n        {\n            match self.inner.get_open_positions().await {\n                Ok(response) if response.result == KrakenApiResult::Success => response\n                    .open_positions\n                    .into_iter()\n                    .map(|position| (position.symbol, position.size))\n                    .collect::<AHashMap<_, _>>(),\n                Ok(response) => {\n                    let error = response\n                        .error\n                        .unwrap_or_else(|| \"Unknown error\".to_string());\n                    log::warn!(\"Failed to get open positions for order quantities: {error}\");","sourceCodeStart":1673,"sourceCodeEnd":1709,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/http/futures/client.rs#L1673-L1709","documentation":"request_order_status_reports fetches open orders via the Kraken Futures API and bails when the response result is not Success, propagating the exchange's error message. The adapter aborts building order status reports since the payload is invalid.","triggerScenarios":"Calling request_order_status_reports when get_open_orders returns a non-Success result — bad signature, invalid nonce, insufficient key permissions, or exchange error.","commonSituations":"API key lacking 'open orders' read scope, clock drift causing nonce errors, or querying during exchange downtime.","solutions":["Inspect the wrapped {error_msg} to identify the exchange-side cause.","Ensure the futures API key has order-read permissions.","Check local clock sync (nonce invalidations) and retry with backoff."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match adapter.request_order_status_reports(None).await {\n    Ok(reports) => process(reports),\n    Err(e) => log::error!(\"open orders fetch failed: {e}\"), // read embedded exchange error\n}","preventionTips":["Grant the API key open-orders read scope.","Keep clocks NTP-synced to avoid nonce rejections.","Avoid polling during known Kraken maintenance windows."],"tags":["kraken","futures","orders","api"],"backgroundTag":"api-error-response","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"}