{"record":{"id":"3fb79a6c69e6f75a","repo":"nautechsystems/nautilus_trader","slug":"failed-to-get-range-e","errorCode":null,"errorMessage":"Failed to get range: {e}","messagePattern":"Failed to get range: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/databento/src/historical.rs","lineNumber":301,"sourceCode":"        let stype_in = infer_symbology_type(first_symbol);\n        let end = params.end.unwrap_or_else(|| self.clock.get_time_ns());\n        let time_range = get_date_time_range(params.start, end)?;\n\n        let range_params = GetRangeParams::builder()\n            .dataset(params.dataset)\n            .date_time_range(time_range)\n            .symbols(symbols)\n            .stype_in(stype_in)\n            .schema(dbn::Schema::Definition)\n            .maybe_limit(params.limit.and_then(NonZeroU64::new))\n            .build();\n\n        let mut client = (*self.inner).clone();\n        let mut decoder = client\n            .timeseries()\n            .get_range(&range_params)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"Failed to get range: {e}\"))?;\n\n        let metadata = decoder.metadata().clone();\n        let mut metadata_cache = MetadataCache::new(metadata);\n        let mut instruments = Vec::new();\n\n        while let Some(msg) = decoder.decode_record::<dbn::InstrumentDefMsg>().await? {\n            let record = dbn::RecordRef::from(msg);\n            let sym_map = self.symbol_venue_map.load();\n            let mut instrument_id = decode_nautilus_instrument_id(\n                &record,\n                &mut metadata_cache,\n                &self.publisher_venue_map,\n                &sym_map,\n            )?;\n\n            if self.use_exchange_as_venue && instrument_id.venue == Venue::GLBX() {\n                let exchange = msg\n                    .exchange()","sourceCodeStart":283,"sourceCodeEnd":319,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/databento/src/historical.rs#L283-L319","documentation":"Wraps a failure from the Databento Timeseries API `get_range` call used inside `get_range_instruments` to fetch instrument definitions. The databento error (auth, bad params, network, API status) is embedded in the message.","triggerScenarios":"Calling `get_range_instruments` where the timeseries request fails: invalid API key, bad dataset/symbol/symbology params, invalid start/end range, network error, or non-success API response.","commonSituations":"start after end, end in the future for a dataset not yet live, symbols not existing on the dataset, expired credentials, rate limits.","solutions":["Inspect the embedded `{e}` for the API's specific complaint","Validate that start <= end and the range overlaps the dataset's availability (see get_dataset_range)","Confirm the symbols and inferred stype_in are valid for the dataset","Check credentials and retry transient network/5xx failures"],"exampleFix":"// before\nlet end = params.end.unwrap_or_else(|| clock.get_time_ns());\n// after\nlet end = params.end.unwrap_or_else(|| clock.get_time_ns());\nassert!(end > params.start, \"end must be after start\");","handlingStrategy":"retry","validationCode":"assert!(params.start < end, \"start must precede end\");\nif params.dataset.is_empty() || params.symbols.is_empty() { bail!(\"invalid params\"); }","typeGuard":"fn params_valid(start: u64, end: u64, dataset: &str, symbols: &[String]) -> bool {\n    start < end && !dataset.is_empty() && !symbols.is_empty()\n}","tryCatchPattern":"match client.get_range_instruments(params).await {\n    Ok(i) => i,\n    Err(e) if is_rate_limit(&e) => { sleep(backoff).await; retry(params).await }\n    Err(e) => return Err(e),\n}","preventionTips":["Validate time ranges (start < end, end within dataset availability) before the call","Confirm symbols exist on the dataset via get_dataset_range/metadata first","Handle rate limits with exponential backoff","Keep the databento crate current to avoid schema/param mismatches"],"tags":["rust","databento","network","api","instrument-definitions"],"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"}