{"record":{"id":"7e94d7bed819c3a0","repo":"nautechsystems/nautilus_trader","slug":"failed-to-get-dataset-range-e","errorCode":null,"errorMessage":"Failed to get dataset range: {e}","messagePattern":"Failed to get dataset range: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/databento/src/historical.rs","lineNumber":259,"sourceCode":"        }\n\n        let precision = self.resolve_price_precision(instrument_id, None)?;\n        precision_cache.insert(*instrument_id, precision);\n        Ok(precision)\n    }\n\n    /// Gets the date range for a specific dataset.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the API request fails.\n    pub async fn get_dataset_range(&self, dataset: &str) -> anyhow::Result<DatasetRange> {\n        let mut client = (*self.inner).clone();\n        let response = client\n            .metadata()\n            .get_dataset_range(dataset)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"Failed to get dataset range: {e}\"))?;\n\n        Ok(DatasetRange {\n            start: response.start.to_string(),\n            end: response.end.to_string(),\n        })\n    }\n\n    /// Fetches instrument definitions for the given parameters.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the API request or data processing fails.\n    pub async fn get_range_instruments(\n        &self,\n        params: RangeQueryParams,\n    ) -> anyhow::Result<Vec<InstrumentAny>> {\n        let symbols: Vec<&str> = params.symbols.iter().map(String::as_str).collect();\n        check_consistent_symbology(&symbols)?;","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/databento/src/historical.rs#L241-L277","documentation":"Wraps a failure from the Databento Metadata API call `get_dataset_range`, which returns the first-to-last available date range for a dataset. The databento error (network, auth, or API-level) is embedded in the message. Raised in `DatabentoHistoricalClient::get_dataset_range`.","triggerScenarios":"Calling `get_dataset_range(dataset)` where the HTTP request fails: invalid API key, unknown/misspelled dataset code, network outage, or Databento API returning an error status.","commonSituations":"Typo'd dataset codes (e.g. 'GLBX.MDP3' misspelled), expired credentials, rate limiting, corporate proxy blocking HTTPS egress.","solutions":["Read the embedded `{e}` to distinguish auth vs network vs API error","Verify the dataset code against Databento's documented dataset list","Confirm the API key has access/licensing for that dataset","Retry on transient network errors; check connectivity/proxy settings"],"exampleFix":"// before\nlet range = client.get_dataset_range(\"GLBX.MDP3\").await?;\n// after\nmatch client.get_dataset_range(\"GLBX.MDP3\").await {\n    Ok(range) => range,\n    Err(e) => { log::error!(\"dataset range failed: {e:#}\"); return Err(e); }\n}","handlingStrategy":"retry","validationCode":"// dataset codes look like 'GLBX.MDP3'\nif dataset.is_empty() || !dataset.contains('.') {\n    bail!(\"suspect dataset code: {dataset}\");\n}","typeGuard":"fn looks_like_dataset_code(s: &str) -> bool {\n    !s.is_empty() && s.contains('.') && s.chars().all(|c| c.is_ascii_alphanumeric() || c == '.' || c == '_')\n}","tryCatchPattern":"let range = loop {\n    match client.get_dataset_range(dataset).await {\n        Ok(r) => break r,\n        Err(e) if is_transient(&e) => { tokio::time::sleep(Duration::from_secs(2)).await; }\n        Err(e) => return Err(e),\n    }\n};","preventionTips":["Validate dataset codes against Databento's published list","Check key permissions/licensing for the dataset before querying","Add bounded retry with backoff for transient network errors","Surface the full error chain ({e:#}) in logs"],"tags":["rust","databento","network","api"],"backgroundTag":"http-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"}