{"record":{"id":"da4d3bd554827b04","repo":"nautechsystems/nautilus_trader","slug":"e-da4d3b","errorCode":null,"errorMessage":"{e}","messagePattern":"\\{e\\}","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/architect_ax/src/http/client.rs","lineNumber":1421,"sourceCode":"\n    /// Requests all instruments from Ax.\n    ///\n    /// Fee rates fall back to the rates last resolved from `GET /whoami`, and to zero when no\n    /// rates have been resolved.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the HTTP request fails or instrument parsing fails.\n    pub async fn request_instruments(\n        &self,\n        maker_fee: Option<Decimal>,\n        taker_fee: Option<Decimal>,\n    ) -> anyhow::Result<Vec<InstrumentAny>> {\n        let resp = self\n            .inner\n            .get_instruments()\n            .await\n            .map_err(|e| anyhow::anyhow!(e))?;\n\n        let (maker_fee, taker_fee) = self.resolve_fees(maker_fee, taker_fee);\n        let ts_init = self.generate_ts_init();\n\n        let mut instruments: Vec<InstrumentAny> = Vec::new();\n        for inst in &resp.instruments {\n            if inst.state == AxInstrumentState::Delisted {\n                log::debug!(\"Skipping delisted instrument: {}\", inst.symbol);\n                continue;\n            }\n\n            // Skip test instruments (not real tradable products)\n            if inst.symbol.starts_with(\"TEST\") {\n                log::debug!(\"Skipping test instrument: {}\", inst.symbol);\n                continue;\n            }\n\n            match parse_instrument(inst, maker_fee, taker_fee, ts_init, ts_init) {","sourceCodeStart":1403,"sourceCodeEnd":1439,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/architect_ax/src/http/client.rs#L1403-L1439","documentation":"`request_instruments` fetches the full instrument list from the AX REST API via `get_instruments()`; a failed HTTP call is converted with `anyhow::anyhow!(e)` and propagated with no extra context (message is just the inner error). Conversion/parse of the returned instruments happens afterwards, so this error is specifically the fetch step failing.","triggerScenarios":"Calling `request_instruments` (instrument provider load) when the instruments REST endpoint errors: network failure, timeout, HTTP 4xx/5xx, malformed response rejected by the HTTP layer.","commonSituations":"AX API outage or maintenance; rate limiting during mass instrument loads; wrong base URL; firewall/proxy blocking the request.","solutions":["Read the propagated error text for the HTTP status or transport message.","Retry with increased `max_retries` / `retry_delay_max_ms` if rate-limited or transient.","Verify the configured `http_base_url` and network/proxy path to AX.","Check AX service status if 5xx errors persist."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// before requesting instruments\nassert!(ax_config.max_retries > 0, \"enable retries for instrument loads\");\n// network preflight\nlet resp = reqwest::get(format!(\"{base}/instruments\")).await?;\nassert!(resp.status().is_success(), \"instruments endpoint returned {}\", resp.status());","typeGuard":null,"tryCatchPattern":"match client.request_instruments(None, None).await {\n    Ok(instruments) => instruments,\n    Err(e) if is_transient(&e.to_string()) => {\n        tokio::time::sleep(Duration::from_secs(5)).await;\n        client.request_instruments(None, None).await?\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Enable client-level retries with backoff for instrument loads.","Avoid loading all instruments during API maintenance windows.","Respect rate limits; stagger multi-venue startup.","Monitor and log HTTP statuses from the AX API."],"tags":["http","api","network","rust"],"backgroundTag":"api-request-failed","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}